Search

Item 4. 인스턴스화를 막으려거든 private 생성자를 사용하라

생성일
2023/07/27 10:35
챕터
2장 - 객체 생성과 파괴

private 생성자로 인스턴스화 막기

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