Основываясь на том, что было написано в вопросе SO Лучшая реализация Singleton на Java, а именно об использовании перечисления для создания синглтона - каковы различия / плюсы / минусы между (конструктор опущен)
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()




Предположим, вы привязываетесь к чему-то, что будет использовать свойства любого данного объекта - вы можете очень легко передать Elvis.INSTANCE, но вы не можете передать Elvis.class и ожидать, что он найдет свойство (если только он не закодирован специально для поиска статические свойства классов).
В основном вы используете шаблон singleton только при хочу экземпляре. Если вам подходят статические методы, просто используйте их и не беспокойтесь о перечислении.
@jontro (повторно) прочтите ответ; он говорит использовать перечисления, когда у вас должен быть синглтон, но избегать синглтона, если вы можете обойтись статическими методами
@MiserableVariable Я прокомментировал это больше года назад. Не могу вспомнить, о каком контексте я имел в виду.
не отвечает на заданный вопрос
@Thufir: Он отвечает на часть «в чем разница», которая, по-видимому, была тем, что больше всего интересовало ОП, учитывая, что ответ был принят.
@Jon, и в чем преимущество использования одноэлементного шаблона перечисления по сравнению с использованием одноэлементного шаблона обычного класса Java?
@LinMa: Он лучше работает с сериализацией, помимо всего прочего. Эффективная версия Java 2 содержит более подробную информацию.
Спасибо, @Jon, какую конкретную часть Effective Java 2nd edition вы имеете в виду? Спасибо.
@LinMa: я не могу вспомнить конкретный номер раздела, но есть часть, которая явно рекомендует использовать перечисления для синглтонов с подробными причинами.
@ Джон, не беспокойся, я найду книгу. Хороших выходных.
@Jon, я позаимствовал книгу Effective Java edition 2, просмотрел разделы Enum (глава 6) и Serialization (глава 11), но не получил никаких подробностей о преимуществах использования Enum для сериализации. Если у вас есть более подробная информация, благодарю за обмен. Хороших выходных. :)
@LinMa: пункт 3 не дает столько подробностей, как я надеялся, но говорит: «Этот подход [перечисления] функционально эквивалентен подходу с общедоступными полями, за исключением того, что он более краток, бесплатно предоставляет механизм сериализации, и обеспечивает надежную гарантию против множественного создания экземпляров даже перед лицом изощренных атак сериализации или отражения ". (Непосредственно перед этим он дает пример кода сериализации, который вы должны написать, чтобы сделать сериализуемый синглтон в случае, отличном от перечисления.)
@Lin: Эффективная Java написана в пунктах ... Это в пункте 3.
@Jon, извини, задал глупый вопрос. Я прочитал раздел в книге, и там сказано, что он предлагает бесплатную сериализацию для INSTANCE enum, что это значит?
@LinMa: это означает, что если вы сериализуете экземпляр, а затем десериализуете, одноэлементный характер будет сохранен (т.е. вы все равно получите ссылку на экземпляр, на который будет ссылаться другой код). Если есть еще вопросы, предлагаю задать в новом посте.
@Jon, конечно и последую твоему совету. Обсудим тут => stackoverflow.com/questions/29585510/instance-in-a-java-enum, хороших выходных. :)
(Stateful) Синглтоны обычно используются для того, чтобы делать вид, что не используют статические переменные. Если вы на самом деле не используете общедоступную статическую переменную, вы обманете меньше людей.
Большое преимущество - это когда ваш синглтон должен реализовывать интерфейс. Следуя вашему примеру:
public enum Elvis implements HasAge {
INSTANCE;
private int age;
@Override
public int getAge() {
return age;
}
}
С участием:
public interface HasAge {
public int getAge();
}
Со статикой этого не сделать ...
Это можно сделать с помощью статики ... public static final HasAge INSTANCE = new HasAge () {private int age; @Override public int getAge () {вернуть возраст; }}; ... так что мне все еще интересно, что хорошего или лучшего в методе enum. Я полагаю, если вам нужно было реализовать два интерфейса?
Я бы выбрал самый простой и понятный вариант. Это несколько субъективно, но если вы не знаете, что является наиболее ясным, выберите самый короткий вариант.
Почему бы не заняться перечислением? Есть ли лучший способ делать синглтоны в java 5?