정적 메서드와 정적 필드만을 담은 클래스를 만들어야 할 경우가 있다.
다음의 경우가 이에 해당한다.
java.lang.Math
, java.util.Arrays
처럼 기본 타입 값이나 배열 관련 메서드들을 모아놓은 경우java.util.Collections
처럼 인터페이스를 구현하는 객체를 생성해주는 정적 메서드를 모아놓은 경우정적 멤버만 담은 클래스는 인스턴스로 만들어 쓰기 위한 클래스가 아니다.
하지만 생성자를 명시하지 않으면 컴파일러가 자동으로 public 생성자를 만들기 때문에 API 문서에 이 정보가 공개되어 사용자가 보기에 헷갈릴 수 있다.
추상클래스로 만들어 이런 점을 막아보려 할 수도 있다. 하지만 하위클래스를 만들어 생성이 가능하기 때문에 이런 방법은 좋은 방법이 아니다.
좋은 해결 방법은 private 생성자를 만들어 주는 것이다. 좀 더 나아가 AssertionError()
를 던지게 하여 실수로라도 생성자를 호출하지 않도록 해줄 수 있다.
또 이 방식은 상속을 불가능하게 만드는 효과도 가진다.
public class MyClass {
// 인스턴스화 방지용
private MyClass() {
throw new AssertionError();
}
}