Як уже було сказано певною мірою, enum - це клас java з особливою умовою, що його визначення повинно починатися хоча б з однієї "постійної перерахунку".
Крім цього, і що enums не може бути розширений або використаний для розширення інших класів, enum - це клас, як і будь-який клас, і ви використовуєте його, додаючи методи нижче постійних визначень:
public enum MySingleton {
INSTANCE;
public void doSomething() { ... }
public synchronized String getSomething() { return something; }
private String something;
}
Ви отримуєте доступ до методів синглтона за цими лініями:
MySingleton.INSTANCE.doSomething();
String something = MySingleton.INSTANCE.getSomething();
Використання enum замість класу - це, як уже згадувалося в інших відповідях, здебільшого про те, що захищено нитковою інстанцією сингтона та гарантією того, що це завжди буде лише одна копія.
І, мабуть, головне, щоб ця поведінка була гарантована самим JVM та специфікацією Java.
Ось розділ із специфікації Java про те, як запобігано кілька екземплярів екземпляра enum:
Тип enum не має інших випадків, ніж ті, які визначені його константами enum. Це помилка часу компіляції для спроби явно інстанціювати тип enum. Остаточний метод клонування в Enum гарантує, що константи перерахунку ніколи не можуть бути клоновані, а спеціальне лікування механізмом серіалізації гарантує, що повторювані екземпляри ніколи не створюються в результаті десеріалізації. Відображаюча інсталяція видів перерахунків заборонена. Ці чотири речі разом забезпечують відсутність екземплярів типу перерахунків, що перевищують визначені константами перерахунків.
Варто зауважити, що після створення екземплярів будь-які проблеми щодо безпеки потоку повинні оброблятися, як і в будь-якому іншому класі з синхронізованим ключовим словом тощо.