정적 메서드, 정적 필드만을 담은 클래스가 간혹 존재한다.
정적 메서드만 있는 유틸리티 클래스(ex. Date
)는 인스턴스를 만들어서 쓸 클래스가 아니다!
그럼 인스턴스가 만들어지는 걸 어떻게 막을 수 있을까?
추상클래스
로 만든다 → 상속받아 인스턴스 만들고 부모타입으로 바꾸면 그만임 (별로 안좋은 방법)
그리고 추상클래스로 만들면 누군가는 이 클래스를 상속하라는 의미
로 받아들일 수 있다.
생성자를 private
로 만들고 다른 사람들을 위해 주석을 꼼꼼하게 작성한다. (좋은 방법)
참고로 내부에서도 생성자를 못쓰게 하려면
private UtilityClass() {
throw new AssertionError(); //Exception이 아니라 Error를 던진다.
}
이렇게 에러를 던지면 된다.
그런데 생성자를 명시해주었는데 에러를 던지는 것은 뭔가 상식적으로 이상하게 느껴진다. 그러니 적절한 주석을 달아두도록 하자.
// 기본 생성자가 만들어지는 것을 막는다(인스턴스화 방지용).
private UtilityClass() {
throw new AssertionError(); //Exception이 아니라 Error를 던진다.
}
책에서는 //
로 주석을 달았지만 java doc
에서 이 생성자 역할을 설명하기 위해 java doc
을 이용한 주석 처리를 해주자!
/**
* 이 클래스는 인스턴스를 만들 수 없습니다.
*/
private UtilityClass() {
throw new AssertionError();
}