Come è stato precedentemente menzionato, un enum è una classe java con la condizione speciale che la sua definizione debba iniziare con almeno una "costante enum".
A parte questo, e che gli enum non possono essere estesi o usati per estendere altre classi, un enum è una classe come qualsiasi classe e la si usa aggiungendo metodi sotto le definizioni costanti:
public enum MySingleton {
INSTANCE;
public void doSomething() { ... }
public synchronized String getSomething() { return something; }
private String something;
}
Accedete ai metodi del singleton seguendo queste linee:
MySingleton.INSTANCE.doSomething();
String something = MySingleton.INSTANCE.getSomething();
L'uso di un enum, invece di una classe, è, come è stato detto in altre risposte, principalmente su un'istanza thread-safe del singleton e una garanzia che sarà sempre solo una copia.
E, forse, soprattutto, che questo comportamento è garantito dalla stessa JVM e dalle specifiche Java.
Ecco una sezione dalla specifica Java su come vengono impedite più istanze di un'istanza enum:
Un tipo enum non ha istanze diverse da quelle definite dalle sue costanti enum. È un errore in fase di compilazione tentare di creare un'istanza esplicita di un tipo enum. Il metodo di clonazione finale in Enum assicura che le costanti di enum non possano mai essere clonate, e il trattamento speciale con il meccanismo di serializzazione garantisce che istanze duplicate non vengano mai create come risultato della deserializzazione. È vietata l'istanza riflessiva dei tipi di enum. Insieme, queste quattro cose assicurano che non esistano istanze di un tipo enum oltre a quelle definite dalle costanti enum.
Vale la pena notare che dopo l'istanza tutte le preoccupazioni relative alla sicurezza dei thread devono essere gestite come in qualsiasi altra classe con la parola chiave sincronizzata ecc.