키워드
public static final 필드 방식의 싱글턴
public class Elvis {
public static final Elvis INSTANCE = new Elvis();
private Elvis() {...}
public void leaveTheBuilding() {...}
}
- 해당 클래스가 초기화될 때 단 한번 생성한다.
- 단, Reflection 이나 직렬화를 통한다면 두 개 이상의 인스턴스가 만들어질 수 있다.
- Reflection 의 경우 private 생성자 호출 시 에러 처리를 추가하면 이를 방지할 수 있다.
- 직렬화의 경우 readResolve() 함수를 구현하면 방지할 수 있다.
정적 팩터리 방식의 싱글턴
public class Elvis {
private static final Elvis INSTANCE = new Elvis();
private Elvis() {...}
public static Elvis getInstance() { return INSTANCE; }
public void leaveTheBuilding() {...}
}
- public static final 필드 방식과 동일하게 Reflection 이나 직렬화 문제는 남아있다.
열거 타입 방식의 싱글턴 (추천)
public enum Elvis {
INSTANCE;
public void leaveTheBuilding() {...}
}
- 이전의 두 방식에 비해 Reflection 이나 직렬화에 대한 위험부담이 없다.
- enum 의 경우 상속을 할 수 없으므로, 상속이 필요한 경우를 제외하고는 enum 을 사용하는 편이 좋다.