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