정적 메서드만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한 클래스가 아니다.
String hello = UtiliyClass.hello();
// 정적 메서드 인지 인스턴스 메서드인지 구별이 어렵다. - anti pattern
~~UtiliyClass utilityClass = new UtilityClass();
utiliyClass.hello();~~
추상 클래스로 만드는 것으로는 인스턴스화를 막을 수 없다.
private 생성자를 추가하면 클래스의 인스턴스화를 막을 수 있다.
생성자에 주석으로 인스턴스화 불가한 이유를 설명하는 것이 좋다.
상속을 방지할 때도 같은 방법을 사용할 수 있다
// Anti pattern
public class UtilityClass {
/**
* 이 클래스는 인스턴스를 만들 수 없습니다.
*/
**private** UtilityClass() {
throw new AssertionError();
}
public static String hello() {
return "hello";
}
public static void main(String[] args) {
String hello = UtilityClass.hello();
UtilityClass utilityClass = new UtilityClass();
utilityClass.hello();
}
}
===
public class DefaultUtilityClass extends UtilityClass { // privat 생성자시 에러
public static void main(String[] args) {
DefaultUtilityClass utilityClass = new DefaultUtilityClass();
utilityClass.hello();
}
}