정적 메서드와 정적 필드만 담은 클래스를 만들 때가 있다. 이런 경우 정적 멤버만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한 것이 아니다. 하지만 생성자를 명시하지 않으면 컴파일러가 자동으로 기본 생성자를 만들어준다. 이 때문에 때때로 공개된 API들에서도 의도치 않게 인스턴스화할 수 있게 된 클래스가 보이곤 한다.
추상 클래스(abstract)를 이용하면 인스턴스화를 막을 수 있을 것이라고 생각하지만, 하위 클래스를 만들면 하위 클래스의 생성자에서 상위 클래스의 생성자를 호출하기 때문에 인스턴스화를 완전히 막지는 못한다.
인스턴스화를 완전히 막는 방법은 private 생성자를 추가하는 것이다. 이 방법은 상속을 불가능하게 하는 효과도 있다.
public class UtilityClass {
private UtilityClass() {
// 예외를 던질 필요는 없지만 클래스 안에서 실수로라도 생성자가 호출되지 않도록 하자.
throw new AssertionError();
}
}