본문 바로가기
이펙티브자바

[이펙티브 자바]아이템4 인스턴스화를 막기 위해 private 생성자 사용하기

by 순원이 2023. 7. 13.

정적 메서드만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한 클래스가 아니다. 따라서 인스턴스 생성을 방지하는 것이 좋다

  • 생성자에 주석으로 인스턴스화가 불가능한 이유를 설명하는 것이 좋다.
  • 추상 클래스로 만드는 것으로는 인스턴스화를 막을 수 없다. abstract클래스는'이 클래스는 상속을 한 후에 사용하세요'라는 용도의 클래스로 오해를 할 가능성도 존재한다.
  • 자바에서는 아무런 생성자도 설정하지 않는 경우, 자동적으로 기본 생성자가 설정된다. 따라서 UtilityClass (추상 클래스)도 기본 생성자가 생성된다.
  • 처음에 사용할 때 인스턴스화를 안 하면 어떻게 사용하지?

문제점

클래스 내부에서는 생성자 호출이 가능하고, 인스턴스를 생성할 수 있다는 것이다

해결

public class UtilityPrivateClass {

	private UtilityPrivateClass() {
	    /**
	     * Creation of UtilityPrivateClass instance is forbidden.
	     */
	
	    System.out.println("UtilityPrivateClass Constructor calls");
	    throw new AssertionError();
	}
}

private 생성자 내부에서 에러를 던지도록 하면 된다.

클래스 내부에서 생성자를 호출하는 경우가 있을 수 있기 때문에 private 생성자 내부에 AssertionError를 던진다.