아이템 4. 인스턴스화를 막으려거든 private 생성자를 사용하라. - ksw6169/effective-java GitHub Wiki

개발 중에 정적 메서드와 정적 필드만을 담은 유틸리티 클래스를 만드는 경우가 있을 수 있다.

  • java.lang.Math, java.util.Arrays : 기본 타입 값이나 배열 관련 메소드들의 모음
  • java.util.Collections : 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메소드(혹은 팩토리)의 모음
  • final 클래스와 관련된 메소드들을 모아놓을 때도 사용할 수 있다.

정적 멤버만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한 것이 아니다. 하지만 생성자를 명시하지 않으면 컴파일러가 자동으로 기본 생성자를 만들어주므로 이를 사용하는 입장에서는 실수로라도 유틸리티 클래스의 생성자를 호출할 수 있다. 따라서 이러한 일을 방지하기 위해 private 생성자를 추가해주어야 한다.

public class StringUtils {
    private StringUtils {
        throw new AssertionError();
    }

    public static boolean isEmpty(String s) {
        return s == null || s.length() == 0;
    }
}

참고 자료

  • Effective Java 3/E