IT/Programming / / 2023. 4. 28. 09:24

<Effective Java> RULE 1. 생성자 대신 정적 팩토리 메소드를 사용할 수 없는지 생각해 보라

반응형

◆ Public으로 선언된 생성자 대신 정적 팩토리 메소드를 제공하는 방법의 장단점

▶장점

1. 생성자와 달리 정적 팩토리 메소드에는 이름이 있다.

클래스는 시그니처별로 하나의 생성자만 넣을수 있는데 이 제약을 피하는 방법은 인자의 순서를 바꾸는 법이다. 하지만 이것은 사용자가 각각 생성자 용도를 절대 기억 못하기 때문에 좋은 방법이 아니다. 하지만 정적 팩토리 메소드에는 이름이 있으므로 무슨 역할을 하는것인지 알기가 쉽다. 따라서 같은 생성자를 여러개 정의할 필요가 있을 때는 그 생성자들을 정적팩토리 메소드로 바꾸고 메소드 이름을 명확히 구분해준다.

 

 

2. 생성자와는 달리 호출할 때마다 새로운 객체를 생성할 필요가 없다.

정적 팩토리 메소드를 사용하면 같은 객체를 반복해서 반환할 수 있으므로 어떤시점에서 어떤 객체가 얼마나 존재할지 정밀하게 제어할 수 있다. 그런 기능을 갖춘 클래스를 개체 통제 클래스 라고하며 이것을 작성하는 이유는 다음과 같다.

1) 개체수를 제어하면 싱글턴 패턴을 따르도록 할 수 있다.

2) 객체 생성이 불가능한 클래스를 만들 수 있다.

3) 변경 불가능한 클래스를 두개의 같은 객체가 존재하지 못하도록 할 수 있다.

 

3. 생성자와는 달리 반환값 자료형의 하위 자료형 객체를 반환할 수 있다.

Public으로 선언되지 않은 클래스의 객체를 반환하는 API를 만들수 있다. 구현 세부사항을 감출 수 있기 때문에 간결한 API가 가능. 이 기법은 인터페이스 기반 프레임워크 구현에 적합하며 이 프레임워크에서의 인터페이스는 정적 팩토리 메소드의 반환값 자료형으로 이용된다.

인터페이스에서 정적 메소드를 가질 수 없으므로, 관습상 반환값 자료형이 Type이라는 이름의 인터페이스인 정적 팩토리 메소드는 Types라는 이름의 객체 생성 불가능 클래스안에 둔다.

 

4. 형 인자 자료형(Parameterized Type)객체를 만들때 편하다.

Map<String , List<String>> m = new HashMap<String, List<String>>();

자료형 명세를 중복하면 형인자가 늘어남에 따라 길고 복잡한 코드가 생성된다. 하지만 정적 팩토리 메소드를 사용하면 컴파일러가 형인자를 자동으로 알아낸다. 이 기법을 유추라고한다.

 

▶ 단점

1. Public이나 Protected로 선언된 생성자가 없으므로 하위 클래스를 만들 수 없다.

Public 정적 팩토리 메소드가 반환하는 비-Public클래스도 마찬가지며 자바의 컬렉션 프레임워크에 포함된 기본 구현 클래스들의 하위 클래스는 만들 수 없다. 그 이유는 계승대신 구성기법을 쓰도록 장려한다는 이유

 

2. 정적 팩토리메소드가 다른 정적 메소드와 확연히 구분되지 않는다.

생성자 대신 정적 팩토리 메소드를 통해 객체를 만들어야 하는 클래스는사용법을 파악하기 쉽지 않다.

 
정적 팩토리 메소드와 Public생성자는 용도가 서로 다르며, 그 차이와 장단점을 이해하는것이 중요하다 정적 팩토리 메소드가 효과적인 경우가 많으니 정적팩토리 메소드를 고려해 보지도 않고 무조건 Public 생성자를 만드는것은 삼가야한다.
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유