Как в некоторой степени упоминалось ранее, enum - это класс java со специальным условием, что его определение должно начинаться хотя бы с одной «константы 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();
Использование перечисления вместо класса, как было упомянуто в других ответах, в основном касается поточно-ориентированной реализации синглтона и гарантии того, что он всегда будет только одной копией.
И, возможно, самое главное, что это поведение гарантировано самой JVM и спецификацией Java.
Вот раздел из спецификации Java о том, как предотвратить несколько экземпляров экземпляра enum:
Тип enum не имеет экземпляров, отличных от определенных его константами. Попытка явно создать экземпляр типа enum - это ошибка времени компиляции. Последний метод клонирования в Enum гарантирует, что константы enum никогда не могут быть клонированы, а специальная обработка механизмом сериализации гарантирует, что повторяющиеся экземпляры никогда не будут созданы в результате десериализации. Рефлексивная реализация типов перечислений запрещена. Вместе эти четыре вещи гарантируют, что экземпляров типа enum не существует, кроме тех, которые определены константами enum.
Стоит отметить, что после создания экземпляра любые проблемы безопасности потока должны обрабатываться, как и в любом другом классе с ключевым словом synchronized и т. Д.