정적 메서드만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한 클래스가 아니다.

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();
    }
}