아이템 4. 객체 생성을 막을 때는 private생성자를 사용하라.
04. 객체 생성을 막을 때는 private생성자를 사용하라.
때로는 정적 메서드나 필드만 모은 클래스를 만들고 싶을 때가 있다.
예를 들어,
java.lang.Math, java.util.Arrays
과 같이, 자바의 기본 자료형 값(primitive value) 또는 배열에 적용되는 메서드를 한군데 모아둘 때 유용하다.java.util.Collections
과 같이, 특정 인터페이스에 대한 구현 객체를 만드는 팩터리 메서드등의 정적 메서드를 모아 놓을 때 유용하다.- final 클래스에 적용할 메서드들을 모아 놓을 때도 활용 할 수 있다.
위와 같은 성격의 유틸리티 클래스(utility class)들은 객체를 만들 목적의 클래스가 아니다.
유틸리티 클래스를 만들때는 아래와 같이 생성자를 private으로 설정하여 JVM이 public 생성자를 만드는 것을 막는 것이 좋다.
public class UtilityClass {
private UtilityClass(){
throw new AssertionError(); // 리플렉션에 의한 private 생성자 호출 방지 ( 규칙 03번 참조 )
}
}
또한, 위와 같이 private으로 선언하고 throw를 사용하여, 생성자 호출을 방지하면, 하위 클래스도 인스턴스를 만들수 없도록 강제 할 수 있다. 모든 생성자는 상위 클래스의 생성자를 명시적이든 아니면 무시적이든 호출 할 수 있어야 하는데, 호출 가능한 생성자가 상위 클래스에 없기 때문이다.