Подтвердить что ты не робот

Почему enum - лучшая реализация для синглтона?

Я прочитал Effective Java и там было сказано, что синглтон лучше всего реализовать с помощью enum.

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

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

Итак, почему мы должны принимать enum как лучшую реализацию для синглтона, кроме причин, указанных выше?

4b9b3361

Ответ 1

это похоже на компромисс для достижения сериализации на лету

Для меня гораздо проще и лаконичнее написать что-то вроде

enum Singleton {
    INSTANCE;
}

Если вам нужно написать намного больше кода или ввести сложность, сделайте это, но это редко требуется IMHO.

Вы теряете более дружественный подход ООП классического синглтона.

Я считаю использование полей проще.

Перечисления не могут быть унаследованы,

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

Если вы хотите предоставить класс скелета, вам нужно создать вспомогательный класс

У вспомогательного класса нет состояния. Класс скелета может иметь некоторое состояние, и в этом случае вам необходимо делегирование.

Кстати: вы можете использовать enum для вспомогательных классов

enum Helper {;
    public static my_static_methods_here;
}

почему мы должны принять enum как лучшую реализацию для синглтона

Я бы следовал принципу ЯГНИ. Развивайте только то, что вам нужно, а не то, что, по вашему мнению, вам может понадобиться.

Ответ 2

Перечисления не могут быть унаследованы

И это одна из лучших частей перечислений, являющихся синглетонами.

Если вы можете наследовать от синглтона, это уже не синглтон.

Ответ 3

Некоторое время назад в stackoverflow было подобное обсуждение: каков эффективный способ реализации одноэлементного шаблона в Java?

Принятый ответ дает хорошие ссылки на эту тему:

Джошуа Блох объяснил этот подход в своем выступлении " Эффективная Java Reloaded" на Google I/O 2008: ссылка на видео. Также см. Слайды 30-32 его презентации (ffective_java_reloaded.pdf):

Главное, что довольно сложно написать синглтон, который является настоящим синглтоном. Значения перечисления гарантированно существуют только один раз, как определено в Спецификации языка Java § 8.9:

Тип enum не имеет экземпляров, отличных от определенных его константами.