반응형
생성자 대신 static 팩토리(factory) 메소드 사용을 고려하자. |
-
일반적인 instance 생성 방법은 생성자(constructor)를 이용하는 것.
-
클래스에 public static 팩토리 메소드를 두는 것이 더 유용하다.
-
public static 팩토리 메소드의 장점
1. 생성자와 달리 자기 나름의 이름을 가질 수 있다.
2. 동일한 시그너처를 갖는 복수의 생성자를 갖는 효과를 누린다.
3. 호출될 때마다 매번 새로운 객체를 생성할 필요가 없다.
불변 클래스의 경우 이미 생성된 인스턴스를 다시 사용할 수 있다.
중복 생성 방지를 할 경우에도 사용된다. ( singleton )
중복 생성 방지를 할 경우에도 사용된다. ( singleton )
4. 자신이 아닌 서브타입(subtype) 객체도 반환할 수 있다.
interface 와 혼합하여 사용하면 유연성이 매우 좋다.
5. 타입 추론 ( Type inference )를 이용하여 매개변수화 타입(parameterized type)의 인스턴스 생성 코드를 간결하게 해준다.
Map<String, List<String>> map = new HashMap<String, List<String>>();
public static <K, V> HashMap<K, V> newInstance(){
return new HashMap<K, V>();
}
Map<String, List<String>> map = HashMap.newInstance();
( But 자바 1.6 까지는 타입 추론이 안 된다. 허나 후에는 기대해볼 수 있다. )
-
public static 팩토리 메소드의 단점
1. 인스턴스 생성을 위해 static factory 메소드만 갖고 있으면서 public 이나 protected 생성자가 없는 클래스의 경우 서브클래스를 가질 수 없다.
public static 팩토리 메소드에서 반환하는 객체의 클래스가 public 이 아닌 경우도 마찬가지.
-> 상속대신 Composition 을 사용하면 이 문제는 해결된다.
2. 다른 static 메소드와 쉽게 구별할 수 없다는 것.
-> 공통적인 작명 규칙을 만듬으로서 보완 가능하다.
valueOf, of, getInstance, newInstance, getType, newType
-
Summary
static factory 메소드와 public 생성자는 모두 나름의 용도가 있으므로 상호간의 장점을 아는 것이 중요하다.
대개의 경우 static 팩토리 메소드가 일반 생성자보다 더 좋을 때가 많다.
So static factory 메소드를 먼저 고려하지 않고 무심코 public 생성자를 사용하는 습관을 피하자.
반응형
'프로그래밍 놀이터 > 디자인 패턴, 리펙토링' 카테고리의 다른 글
[Effective Java] private 생성자나 enum 타입을 사용해서 싱글톤의 특성을 유지하자. (0) | 2015.02.25 |
---|---|
[Effective Java] 생성자의 매개변수가 많을 때는 빌더(builder)를 고려하자. (0) | 2015.02.08 |
[Effective Java] 핵심정리 다시 시작. (0) | 2014.09.06 |
[용어] CQRS 란? ( Command Query Responsibility Segregation ) (0) | 2012.10.20 |
[Design Pattern/Java] 추상 클래스보다는 인터페이스를 사용하자. (0) | 2012.03.29 |
댓글