생성 된 인스턴스가 오직 하나 뿐인 클래스를 뜻한다.
무상태 객체나 유일해야 하는 시스템 컴포넌트 는 싱글턴으로 만들어야 한다.
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() { ... }
}
위에 예시로 적은 항목과 동일하게 접근을 막을 수 있다.