public class Elvis {
public static final Elvis INSTANCE = new Elvis();
private Elvis() { ... }
public void leaveTheBuilding() { ... }
}
private 생성자는 public static final 필드인 Elvis.INSTANCE를 초기화할 때
딱 한번만 호출됩니다.
public이나 protected 생성자가 없으므로 Elvis 클래스가 초기화될 때 만들어진 인스턴스가 전체 시스템에서 하나뿐임이 보장됩니다.
public class Elvis {
private static final Elvis INSTANCE = new Elvis();
private Elvis() { ... }
public static Elvis getInstance() { return INSTANCE; }
public void leaveTheBuilding() { ... }
}
Elvis.getInstance
는 항상 같은 객체의 참조를 반환하므로 제2의 Elvis 인스턴스란 결코 만들어지지 않습니다.
장점
public enum Elvis {
INSTANCE;
public void leaveTheBuilding() { ... }
}
직렬화
할 수 있습니다.테스트
하기가 어려워질 수 있습니다.타입을 인터페이스로 정의한 다음 그 인터페이스를 구현해서 만든 싱글턴
이 아니라면 싱글턴 인스턴스를 가짜(mock) 구현으로 대체할 수 없기 때문입니다.