하루 한장/이펙티브 자바

아이템 1. 핵심 정리 - 정적 팩터리 메서드의 단점

ta_chan 2023. 7. 25. 22:50
  • 상속을 하려면 public이나 protected 생성하기 필요하니 정적 팩터리 메서드만 제공하면 하위 클래스를 만들 수 없다.
    • private 생성자가 외부에서 접근할 수 없기 때문인데, 상속받은 서브 클래스에서 슈퍼클래스 생성자를 호출할 수 없게 되기 때문이다.
    • 쉽게 말해서 private이기 때문에 상속이 불가능하다
package org.example;

public class Settings {
    private boolean useAutoSteering;
    private boolean useABS;
    private Difficulty difficulty;

    private Settings(){} 기본생성자가 private이기 때문에 상속을 할 수 없다.
    private static final Settings SETTINGS = new Settings();

    public static Settings newInstance(){
        return SETTINGS;
    }

}
  • 정적 팩터리 메서드는 프로그래머가 찾기 어렵다
    • 특히나 문서화(java doc)같은 경우, 생성자는 파라미터가 분명하게 표기되지만 정적 팩터리 메서드는 파라미터가 보이지 않는다.
    • 이럴 땐 아래와 같은 주석 형식을 사용하면 명세서에 설명을 붙일 수 있다.
package org.example;

/**
 * 이 클래스의 인스턴스는 #getInstance()를 통해 사용한다.
 * @see Settings#getInstance()
 */
public class Settings {
    private boolean useAutoSteering;
    private boolean useABS;
    private Difficulty difficulty;

    private Settings(){}
    private static final Settings SETTINGS = new Settings();

    public static Settings getInstance(){
        return SETTINGS;
    }

}