본문 바로가기

IT/자바

[Effective Java] Item 4 인스턴스화를 막으려거든 private 생성자를 사용하라

반응형

객체지향적으로 봤을때 정적 메서드나 정적필드만을 모아두는 클래스는 좋지 않지만, 나름 필요한 경우가 있다. 

1) java.lang.Math나 java.util.Arrays처럼 기본 타입 값이나 배열 관련 메서드들을 모아놓는 경우

2) java.util.collections처럼 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드를 모아놓는 경우

3) final 클래스와 관련한 메서드들을 모아놓은 경우 (final 클래스는 상속해서 하위 클래스에 메서드를 추가하는 것이 불가능하기 때문에)

 

정적 멤버만을 담을 유틸리티 클래스는 인스턴스를 생성해서는 안된다.

하지만, 생성자를 명시하지 않으면 자바에서 자동으로 public 생성자를 만들기 때문에 의도치 않게 인스턴스화를 할 수 있는 경우가 발생한다. 

 

이 문제를 해결하기 위해 private 생성자를 추가함으로 인스턴스화하는걸 막을 수 있다.

public class NutritionFacts {
    
    // 기본 생성자가 만들어지는 걸 막는다 (인스턴스화 방지용)
    private NutritionFacts(){
        throw new AssertionError();
    }
}

위 코드처럼 실수로라도 개발자가 생성자를 호출하는걸 막기 위해 Error를 던질 수도 있다.

(직관적인 코드는 아니기에 주석으로 코멘트를 달아주는 것이 좋음)

반응형