Jak do pewnego stopnia wspomniano wcześniej, wyliczenie jest klasą Java ze specjalnym warunkiem, że jej definicja musi zaczynać się od co najmniej jednej „stałej wyliczenia”.
Poza tym, a wyliczenia nie mogą być rozszerzane ani używane do rozszerzania innych klas, wyliczenie jest klasą jak każda inna klasa i można jej używać, dodając metody poniżej definicji stałych:
public enum MySingleton {
INSTANCE;
public void doSomething() { ... }
public synchronized String getSomething() { return something; }
private String something;
}
Dostęp do metod singletona można uzyskać w następujący sposób:
MySingleton.INSTANCE.doSomething();
String something = MySingleton.INSTANCE.getSomething();
Użycie wyliczenia zamiast klasy polega, jak wspomniano w innych odpowiedziach, głównie na bezpieczną wątkowo instancję singletona i gwarancję, że będzie to zawsze tylko jedna kopia.
I, być może, co najważniejsze, to zachowanie jest gwarantowane przez samą maszynę JVM i specyfikację Java.
Oto sekcja ze specyfikacji Java na temat zapobiegania wielu wystąpieniom instancji wyliczeniowej:
Typ wyliczeniowy nie ma innych wystąpień niż te zdefiniowane przez jego stałe wyliczeniowe. Próba jawnego utworzenia wystąpienia typu wyliczeniowego jest błędem czasu kompilacji. Ostateczna metoda klonowania w Enum zapewnia, że stałe wyliczenia nie mogą być klonowane, a specjalne traktowanie przez mechanizm serializacji zapewnia, że zduplikowane wystąpienia nigdy nie są tworzone w wyniku deserializacji. Odblaskowe tworzenie instancji typów wyliczeniowych jest zabronione. Razem te cztery rzeczy zapewniają, że żadne wystąpienia typu wyliczenia nie istnieją poza tymi zdefiniowanymi przez stałe wyliczenia.
Warto zauważyć, że po utworzeniu instancji wszelkie problemy związane z bezpieczeństwem wątków muszą być obsługiwane jak w każdej innej klasie za pomocą słowa kluczowego synchronized itp.