[Effective Java] 4. 객체 생성을 막을때 private 생성자 활용

최대 1 분 소요

객체 생성을 막고자 할 경우 private 생성자를 사용하자.

가끔 Utility성 Class로 static method나 field만 모은 클래스를 만들때가 있다.
이런 구조는 객체지향적이지 않기 때문에 남용하면 안된다. 하지만 반드시 필요한 경우도 있기 때문에 자주 사용되는 구조이기도 하다.

이런 Utility 성격의 Class는 객체를 만들 목적이 아니기 때문에 생성자를 막는것이 좋다.

생성자가 없어도 컴파일러에 의해 자동으로 parameter없는 default 생성자가 만들어지기 때문에 명시적으로 막아줘야 한다.

참고로 private 생성자를 통해 생성자 호출을 막으면 자식 클래스를 만들 수 없다. 자식은 반드시 부모의 생성자를 호출해줘야 하기 때문이다.

1. abstract class로 만드는 방법

객체 생성을 막기 위해 Utility class를 abstract로 만들수도 있지만 이는 좋지 않다. 이 class를 상속받는 class를 만드는 순간 객체 생성이 가능해지기 때문이다.

2. private 생성자

실수로 호출하는 것을 방지도 하고, reflection을 통해 생성자가 호출되어 객체가 생성되는것을 방지하기 위해 exception을 던지도록 처리하자.

private UtilityClass() {
	throw new AssertionError();
}

reflection을 통해 private 생성자가 호출될 수 있다. 이 내용은 [Effective Java] 3. Singleton 패턴에 대해서 포스팅을 참고할 것.

댓글남기기