Является ли Single-Enum Type Singleton действительно широко принятой хорошей идеей? - PullRequest
20 голосов
/ 23 июня 2010

В пункте 3 Джоша Блока Effective Java (Применение свойства Singleton с помощью частного конструктора или перечислителя) упоминается, что «хотя этот подход еще не получил широкого распространения, тип перечисления с одним элементом являетсялучший способ реализации синглтона. "

Пример:

   public enum Elvis {
       INSTANCE;
       private final String[] favoriteSongs =
           { "Hound Dog", "Heartbreak Hotel" };
       public void printFavorites() {
           System.out.println(Arrays.toString(favoriteSongs));
       }
   }

Продолжение:" Этот подход функционально эквивалентен подходу открытого поля, за исключением того, что он более лаконичен, обеспечивает механизм сериализациибесплатно и предоставляет железную гарантию от множественных реализаций, даже перед лицом изощренных сериализационных или рефлекторных атак. "

Самый большой минус, который я вижу: разве перечисления не должны иметь изменяемое состояние?Кажется распространенным использование Singleton с состоянием.

Так стал ли этот паттерн на самом деле более распространенным после даты публикации (2-е издание, опубликованное в 2008 году)?

Ответы [ 5 ]

10 голосов
/ 23 июня 2010

Хотя перечисления обычно не имеют изменяемого состояния, этот факт основан на предположениях о том, как будет использоваться перечисление.Хотя эти предположения обычно выполняются, они не всегда, и один из таких случаев, когда они не делают, при создании Singleton.

Хотя это не самое распространенное использование перечислений, вполне законно иметьenum с изменяемым состоянием, хотя вы можете захотеть указать этот факт в своем коде, чтобы любой другой программист, который может на это смотреть, не запутался.

Что касается популярности этого шаблона проектирования, я 'Я видел это довольно часто, но не настолько, чтобы я сказал, что это стало "обычным".

8 голосов
/ 23 июня 2010

(Этот ответ предполагает, что «принудительный» синглтон действительно , что вы хотите, в отличие от де-факто синглтона, управляемого вашей структурой DI (например, @Singleton) Гисе, что, вероятно, чаще правильная идея.)

Чтобы разделить ваш вопрос на две части: действительно ли он широко принят? Нет, не так широко, как должно быть. Это хорошая идея? Да!

Перечисление Java - это класс, который может иметь только фиксированный набор из N экземпляров, жестко закодированных в источнике.

Синглтон - это класс, который может иметь только фиксированный набор из N экземпляров, которые жестко заданы в источнике. И N == 1.

Это так просто!

3 голосов
/ 23 июня 2010

Перечисления могут иметь изменяемое состояние. Обычно это не очень хорошая идея, потому что природа перечисления состоит в том, чтобы иметь ровно X версий типа Y, где X больше 1, поэтому жонглирование вокруг состояния (кроме использования полей / свойств) становится чем-то вроде кошмара, поскольку каждый метод необходимо учитывать все возможные состояния всех констант перечисления X.

Но если вы все равно собираетесь определять перечисление только с одной константой; Вы можете просто рассматривать эту единственную константу как обычный объект и делать все допущения, которые с ней связаны. IOW: проблема наличия X-версий состояния исчезает, потому что X теперь равен 1.

1 голос
/ 24 июня 2010

Нет enum s не должен иметь изменяемое состояние. Статика обычно не должна быть изменчивой. Синглтоны - просто способы запутать изменчивую статику. (Объекты без состояния, которые реализуют интерфейс, это другой вопрос.)

0 голосов
/ 24 июня 2010

Это не очень хорошая идея.

Это заставляет ваш класс наследовать от конкретного класса Enum. Это загрязняет вашу иерархию типов.

Тип INSTANCE должен быть точно Elvis; это не может быть некоторый подтип Elvis.

В целом, у вас нет свободы выбора способа создания экземпляра.

И по синтаксису, это действительно слишком много печатать?

public class Elvis {
    static public Elvis INSTANCE = new Elvis();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...