본문 바로가기
프로그래밍 놀이터/디자인 패턴, 리펙토링

[Effective Java] 생성자 대신 static 팩토리(factory) 메소드 사용을 고려하자.

by 돼지왕 왕돼지 2014. 9. 8.
반응형

 생성자 대신 static 팩토리(factory) 메소드 사용을 고려하자.

 

-

일반적인 instance 생성 방법은 생성자(constructor)를 이용하는 것.

-
클래스에 public static 팩토리 메소드를 두는 것이 더 유용하다.

-
public static 팩토리 메소드의 장점
    1. 생성자와 달리 자기 나름의 이름을 가질 수 있다.


    2. 동일한 시그너처를 갖는 복수의 생성자를 갖는 효과를 누린다.

    3. 호출될 때마다 매번 새로운 객체를 생성할 필요가 없다.
        불변 클래스의 경우 이미 생성된 인스턴스를 다시 사용할 수 있다.
        중복 생성 방지를 할 경우에도 사용된다. ( 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 생성자를 사용하는 습관을 피하자.





반응형

댓글