Java/이펙티브 자바

아이템4. 인스턴스화를 막으려거든 private 생성자를 사용하라

PHM 2022. 11. 1. 10:57

핵심정리

- 정적 메서드만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한 클래스가 아니다

public class UtilityClass {

    public static String hello() {
        return "hello";
    }

    public static void main(String[] args) {
        String hello = UtilityClass.hello();

        // 인스턴스 불필요
        UtilityClass utilityClass = new UtilityClass();
        utilityClass.hello();
    }
}

- 추상 클래스로 만드는 것으로 완벽히 인스턴스화를 막을 수 없다

public abstract class UtilityClass {

    public UtilityClass() {
        System.out.println("Constructor");
    }
    ...
}
public class DefaultUtilityClass extends UtilityClass{

    public static void main(String[] args) {
        DefaultUtilityClass utilityClass = new DefaultUtilityClass();
    }
}

    ㆍ서브 클래스를 만들면 인스턴스를 만들 수 있게 된다. ( 자식 클래스 인스턴스를 만들때 상위 클래스 생성자를 호출 )

 

- private 생성자를 추가하면 클래스의 인스턴스화를 막을 수 있다

public class UtilityClass {

    /**
     * 이 클래스는 인스턴스를 만들 수 없습니다.
     */
    private UtilityClass() {
        // 내부에서는 호출 가능하므로
        throw new AssertionError();	// 에러 처리 ( 생성자가 사용된다면 )
    }
    ...
}

- 생성자에 주석으로 인스턴스화 불가한 이유를 설명하는 것이 좋다

    ㆍ'왜 못쓰는 코드를 만들었을까' 에 대한 해결

- 상속을 방지할 때도 같은 방법을 사용할 수 있다