Wie bereits erwähnt, ist eine Aufzählung eine Java-Klasse mit der besonderen Bedingung, dass ihre Definition mit mindestens einer "Aufzählungskonstante" beginnen muss.
Abgesehen davon, dass Aufzählungen nicht erweitert oder zum Erweitern anderer Klassen verwendet werden können, ist eine Aufzählung eine Klasse wie jede andere Klasse, und Sie verwenden sie, indem Sie Methoden unterhalb der Konstantendefinitionen hinzufügen:
public enum MySingleton {
INSTANCE;
public void doSomething() { ... }
public synchronized String getSomething() { return something; }
private String something;
}
Sie greifen auf die folgenden Methoden des Singletons zu:
MySingleton.INSTANCE.doSomething();
String something = MySingleton.INSTANCE.getSomething();
Bei der Verwendung einer Aufzählung anstelle einer Klasse geht es, wie in anderen Antworten erwähnt, hauptsächlich um eine thread-sichere Instanziierung des Singletons und die Garantie, dass es sich immer nur um eine Kopie handelt.
Und vielleicht am wichtigsten ist, dass dieses Verhalten durch die JVM selbst und die Java-Spezifikation garantiert wird.
Hier ist ein Abschnitt aus der Java-Spezifikation, wie mehrere Instanzen einer Enum-Instanz verhindert werden:
Ein Aufzählungstyp hat keine anderen Instanzen als die durch seine Aufzählungskonstanten definierten. Es ist ein Fehler beim Kompilieren, wenn versucht wird, einen Aufzählungstyp explizit zu instanziieren. Die endgültige Klonmethode in Enum stellt sicher, dass Enum-Konstanten niemals geklont werden können, und die spezielle Behandlung durch den Serialisierungsmechanismus stellt sicher, dass durch Deserialisierung niemals doppelte Instanzen erstellt werden. Die reflektierende Instanziierung von Aufzählungstypen ist verboten. Zusammen stellen diese vier Dinge sicher, dass keine Instanzen eines Aufzählungstyps existieren, die über die durch die Aufzählungskonstanten definierten hinausgehen.
Bemerkenswert ist, dass nach der Instanziierung alle Thread-Sicherheitsbedenken wie in jeder anderen Klasse mit dem synchronisierten Schlüsselwort usw. behandelt werden müssen.