Каков наилучший подход для использования Enum в качестве синглтона в Java?
Основываясь на том, что было написано в вопросе SO. Лучшая реализация Singleton в Java - а именно об использовании enum для создания singleton - каковы различия / плюсы / минусы (конструктор опущен)
public enum Elvis {
INSTANCE;
private int age;
public int getAge() {
return age;
}
}
а потом звонит Elvis.INSTANCE.getAge()
а также
public enum Elvis {
INSTANCE;
private int age;
public static int getAge() {
return INSTANCE.age;
}
}
а потом звонит Elvis.getAge()
4 ответа
Предположим, что вы привязываетесь к чему-то, что будет использовать свойства любого заданного объекта - вы можете очень легко передать Elvis.INSTANCE, но вы не можете передать Elvis.class и ожидать, что он найдет свойство (если оно не намеренно закодировано для поиска статические свойства классов).
В основном вы используете шаблон синглтона только тогда, когда вам нужен экземпляр. Если у вас хорошо работают статические методы, просто используйте их и не беспокойтесь о enum.
Большое преимущество, когда ваш синглтон должен реализовывать интерфейс. Следуя вашему примеру:
public enum Elvis implements HasAge {
INSTANCE;
private int age;
@Override
public int getAge() {
return age;
}
}
С:
public interface HasAge {
public int getAge();
}
Это не может быть сделано с помощью статики...
(Stateful) Синглтоны обычно используются, чтобы притворяться, что не используют статические переменные. Если вы на самом деле не используете публично статическую переменную, то вы обманете меньше людей.
Я бы выбрал самый простой и понятный вариант. Это несколько субъективно, но если вы не знаете, что лучше, просто выберите самый короткий вариант.