앞에서도 언급했듯이, 열거 형은 그 정의가 적어도 하나의 "열상 수"로 시작해야한다는 특수한 조건을 가진 Java 클래스입니다.
그 외에는 열거 형을 확장하거나 다른 클래스를 확장하는 데 사용할 수 없으므로 열거 형은 모든 클래스와 같은 클래스이며 상수 정의 아래에 메소드를 추가하여 사용합니다.
public enum MySingleton {
INSTANCE;
public void doSomething() { ... }
public synchronized String getSomething() { return something; }
private String something;
}
다음 행을 따라 싱글 톤의 메소드에 액세스하십시오.
MySingleton.INSTANCE.doSomething();
String something = MySingleton.INSTANCE.getSomething();
클래스 대신 열거 형을 사용하는 것은 다른 답변에서 언급했듯이 대부분 싱글 톤의 스레드 안전 인스턴스화와 항상 하나의 사본 만 보장한다는 것입니다.
그리고 가장 중요한 것은이 동작이 JVM 자체와 Java 사양에 의해 보장된다는 것입니다.
다음 은 열거 형 인스턴스의 여러 인스턴스를 방지하는 방법에 대한 Java 사양 섹션입니다 .
열거 형에는 열거 형 상수로 정의 된 인스턴스 이외의 인스턴스가 없습니다. 열거 형 유형을 명시 적으로 인스턴스화하려고 시도하면 컴파일 타임 오류입니다. Enum의 최종 복제 방법을 사용하면 열거 상수를 복제 할 수 없으며 직렬화 메커니즘에 의한 특수 처리를 통해 역 직렬화의 결과로 중복 인스턴스가 생성되지 않습니다. 열거 형 유형의 반사 인스턴스화는 금지됩니다. 이 네 가지가 함께 있으면 열거 형 상수에 의해 정의 된 것 이상의 열거 형 인스턴스가 존재하지 않습니다.
주목할만한 점은 인스턴스화 후 thread 안전 문제는 다른 키워드와 마찬가지로 synchronized 키워드 등으로 처리해야한다는 것입니다.