유틸리티 기능을 제공하려면 보통 정적 메서드, 정적 필드만 담은 클래스를 필요로 한다. java.lang.Math
,java.util.Arrays
와 같은 클래스는 기본 타입 값과 배열 관련 메서드들을 모아 놓은 유틸리티 클래스다. 혹은 java.util.Collections
처럼 특정 인터페이스의 객체를 생성해주는 정적 팩터리 메서드를 모아 놓은 클래스도 있다. 이런 클래스들은 인스턴스화 하려고 만든 클래스가 아니기 때문에 인스턴스화를 막을 방법이 필요하다.
public class UtilityClass {
private UtilityClass() {
throw new AssertionError();
}
... // 나머지 코드 생략
}
추상 클래스로 만드는 건 클래스를 상속해서 인스턴스화 해버리면 되기 때문에 적절한 방법이 아니다.
인스턴스화는 private 생성자를 만들어주기만 하면 막을 수 있다. 클래스를 상속해서 인스턴스화 하려고해도 부모 클래스의 생성자가 호출되어야 하기 때문에 불가능하다. 생성자에서 꼭 AssertionError
예외를 던질 필요는 없지만 혹시 클래스 내부에서 생성자가 불리는 것까지 방지해준다.