[Effective Java] 인스턴스화를 막으려거든 private 생성자를 사용하라

유틸리티 클래스

단순히 정적 메서드와 정적 필드만을 가진 클래스를 만들어야할 때가 있다. 예컨데 java.lang.Math와 java.util.Arrays와 같은 클래스들이 이에 해당된다. 정적 멤버만 담은 유틸리티 클래스는 인스턴스화 해서 사용하려고 만든게 아니다. 그렇기 때문에 인스턴스화를 막아야 한다. 추상 클래스로는 인스턴스화를 막을 수 없다. 하위 클래스를 만들어 인스턴스화 하면 되기 때문이다. 추상 클래스로 만들면 마치 상속해서 쓰라는 것 처럼 보인다.

private 생성자를 추가하면 된다. 생성자에 에러를 추가하면 더 좋다. 실수로 클래스 내부에서 생성자를 호출할 위험이 적어진다. 이 방식은 상속을 불가능하게 하는 효과도 있다. 명시적이든 묵시적이든 하위 클래스는 상위 클래스의 생성자를 호출하게 되는데 상위 클래스의 생성자가 private라 호출할 수 없다.

1
2
3
4
5
6
public class UtilityClass{
private UtilityClass() {
throw new AssertionError();
}
// do something...
}
Author: Song Hayoung
Link: https://songhayoung.github.io/2020/08/04/Languages/Effective%20JAVA/item4/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.