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

swucs·2022년 2월 12일
0

이펙티브 자바

목록 보기
1/2

출처 : 이펙티브 자바 (제2판)

생성자로 인스턴스를 생성하는 것 대신 public static 팩토리 메소드로 그 클래스의 인스턴스 하나를 생성하여 반환하는 방법이 있다.

public static Boolean valueOf(boolean b) {
	return b ? Boolean.TRUE : Boolean.FALSE;
}

디자인 패턴에는 이것과 동일한 것이 없다.

static 팩토리 메소드의 장점

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

  2. 호출될 때 마다 매번 새로운 객체를 생성할 필요가 없다.

    • Flyweight 패턴과 유사
    • 동일한 객체(인스턴스가) 자주 사용될 때, 객체 생성히 자원이나 시간이 많이 든다면 프로그램 성능을 크게 향상 시킬 수 있다.
    • 항상 동일 객체를 반환하므로 클래스에서는 인스턴들의 존재를 직접 제어가능 (인스턴스 제어 클래스)
    • equals 메소드 대신 == 연산자를 사용할 수 있다.
  3. 자신이 반환하는 타입의 어떤 서브타입(subtype) 객체도 반환할 수 있다.

  4. 매개변수화 타입의 인스턴스를 생성하는 코드를 간결하게 해준다.

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

    static 팩토리를 사용하면 이를 해결할 수 있다. 이를 타입추론이라고 한다. 예를 들어 HashMap에서 다음의 static 팩토리 메소드를 제공한다고 가정해보자.

    public static <K, V> HashMap<K, V> newInstance() {
    	return new HashMap<K, V>();
    }
    ...
    Map<String, List<String>> m = HashMap.newInstance();

static 팩토리 메소드의 단점

  1. public, protected의 생성자가 없으므로 서브 클래스를 가질 수 없다. (상속이 불가능하다.)
    이런 단점이 장점이 될 수도 있다. 상속대신에 컴포지션(합성)을 사용하게끔 해주기 때문이다.
  2. 다른 static 메소드와 쉽게 구별할 수 없다.
    static 팩토리 메소드는 다른 메소드와 섞여 있어서 잘 구분되지 않는다. 따라서 인스턴스를 어떻게 생성하는지 알기 어려울 수 있다.

대개의 경우 static 팩토리 메소드가 더 좋을 때가 많으므로 static 팩토리 메소드를 먼저 고려하지 않고 무심코 public 생성자를 사용하는 습관을 피하자.

profile
백엔드 개발자

0개의 댓글

관련 채용 정보