private 생성자로 인스턴스화 막기
•
단순히 정적 메서드와 정적 필드만을 담은 클래스가 필요한 상황이 있다.
◦
java.lang.Math나 java.util.Arrays처럼 기본 타입 값이나 배열 관련 메서드들을 모아놓기
◦
java.util.Collections처럼 특정 인터페이스를 구현하는 객체를 생성해주는 정적 팩터리를 모아놓기
◦
final 클래스와 관련한 메서드들을 모아놓기
•
이렇게 정적 멤버만 담은 유틸리티 클래스는 인스턴스로 만들어 사용하려 설계한 것이 아니므로, 인스턴스화를 막을 필요가 있다.
•
생성자를 명시하지 않으면 컴파일러가 자동으로 public 기본 생성자를 만들어주고, 이로 인해 의도치 않게 인스턴스화할 수 있게 된 클래스들이 있다.
•
추상 클래스로 만들어두는 것으로는 하위 클래스를 만들어 인스턴스화 하면 되기 때문에, 인스턴스화를 막을 수 없다.
•
private 생성자를 추가하여 컴파일러가 기본 생성자를 만들지 않도록 하자.
•
명시적 생성자가 private이므로 클래스 바깥에서는 접근할 수 없고, 생성자 내부에서 AssertionError를 던져 리플렉션을 통해 생성하는 것을 막자.
•
또한 이 방법은 상속을 불가능하게 만드는 효과도 있다. 생성자를 private로 선언하여 하위 클래스가 상위 클래스의 생성자를 호출할 방법이 없기 때문이다.