정적 멤버만 담은 유틸리티 클래스는 인스턴스화를 막기 위해 private 생성자를 만들어야 한다.
종종 정적 메서드와 정적 필드만 존재하는 클래스를 만들어야 할 때가 있다.
- 기본 타입 값이나 배열 관련 메서드를 모을 때
- java.util.Arrays, java.lang.Math
- 특정 인터페이스를 구현하는 객체를 생성하는 정적 (팩터리) 메서드를 모을 때
- java.util.Collections
- final 클래스와 관련된 메서드를 모을 때
- final 클래스는 상속이 불가능하므로 하위 클래스에 메서드를 생성하지 못하기 때문
정적 멤버만 담은 유틸리티 클래스에 생성자를 명시하지 않으면, 컴파일러가 자동으로 기본 생성자를 만든다. 즉, 매개변수 없는 public 생성자가 만들어져 의도치 않게 API를 공개하게 될 수 있다.
아래 예시처럼 명시적으로 private 생성자를 만들어서 객체가 생성될 가능성을 없애면 인스턴스화를 막을 뿐 아니라 하위 클래스가 생성되는 것도 막을 수 있다. 다만 원래 private 생성자의 목적대로 쓰이고 있지 않기 때문에 따로 주석을 달아두는 것이 좋다.
public class UtilityClass {
// 인스턴스화 방지
private UtilityClass() {
throw new AssertionError();
}
}
'Java > 내맘대로 Effective Java' 카테고리의 다른 글
[Item 6] 불필요한 객체 생성을 피하라 (0) | 2022.03.06 |
---|---|
[Item 5] 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 (0) | 2022.03.05 |
[Item 3] private 생성자나 열거 타입으로 싱글턴임을 보증하라 (0) | 2022.03.02 |
[Item 2] 생성자에 매개변수가 많다면 빌더를 고려해라 (0) | 2022.03.01 |
[Item 1] 생성자 대신 정적 팩토리 메서드를 고려하라 (0) | 2022.03.01 |