[Effective Java] private 생성자나 열거 타입으로 싱글턴임을 보증하라 정리

mongBrown·2026년 1월 29일

싱글턴(Singleton)

생성 된 인스턴스가 오직 하나 뿐인 클래스를 뜻한다.

무상태 객체나 유일해야 하는 시스템 컴포넌트 는 싱글턴으로 만들어야 한다.

public class Elvis {
	public static final Elvis INSTANCE = new Elvis();
	private Elivs() {
		throw new Exception("이래도 못만들어");
	}
	
	public void leaveTheBuilding() { ... }
	
	private Object readResolve() {
		return INSTANCE;
	}
}

위와 같이 private 생성자를 통해서 하나 뿐임을 보증할 수 있으나.

리플렉션 API 를 통해서 private 생성자를 호출할 수도 있다고 한다.

위를 막기 위해서는 위 코드와 같이 예외를 던져서 만들지 못하게 할 수 있다.

그리고, 정적 생성자 / 정적 팩터리 메서드를 통해 싱글턴을 보장할 수 있으나, Object 의 ReadResolve 를 통해 또다른 Elvis 를 만들 수 있어 해당 부분도 추가 해야한다.

이 부분을 좀더 간단하게 해결하기 위해서는 열거 타입으로 생성하는 것이다.

public enum Elvis {
	INSTANCE;
	
	public void leaveTheBuilding() { ... }
}

위에 예시로 적은 항목과 동일하게 접근을 막을 수 있다.

profile
화이팅!

0개의 댓글