아이템4. 인스턴스화를 막으려거든 private 생성자를 사용하라
- 정적 메서드와 정적 필드만을 담은 클래스
- 예시
java.lang.Math와 java.util.Array: 기본 타입 값이나 배열 관련 메서드를 모아놓음
java.util.Collections: 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드(혹은 팩터리) 모음(자바 8부터는 인터페이스에 넣을 수 있다)
- final 클래스와 관련한 메서드를 모을 경우: final클래스를 상속해서 하위 클래스에 메서드를 넣는 건 불가능하기 때문
- 인스턴스 없이 사용하려고 설계한 유틸리티 클래스
- 생성자를 명시하지 않으면 public 기본 생성자가 만들어지기에, 의도치 않게 인스턴스화 가능해짐
- 인스턴스화를 막기 위해서
- 추상 클래스로 만드는 것으로는 부족
- 하위 클래스를 만들어서 인스턴스화할 수 있기 때문
- 상속해서 사용하라는 의미로 오독될 수도 있다.
- private 생성자를 추가하여 클래스의 인스턴스화를 막아라!
public class UtilityClass() {
private UtilityClass() {
throw new AssertionError();
}
...
}
- AssertionError는 클래스 내부에서 생성자를 호출하는 경우를 대비
- 호출 불가능한 생성자는 직관성이 낮기 때문에 주석을 달아주는 편이 좋음
- 상속을 불가능하게 만든다.
- 모든 생성자는 명시적/묵시적으로 상위 클래스의 생성자를 호출하게 된다. private 생성자는 하위 클래스가 상위 클래스 생성자에 접근할 수 없게 하기에 상속이 불가하게 만든다.