Каков наилучший подход для использования Enum как синглтона в Java?

Основываясь на том, что было написано в вопросе 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()

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
85
0
76 554
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Предположим, вы привязываетесь к чему-то, что будет использовать свойства любого данного объекта - вы можете очень легко передать Elvis.INSTANCE, но вы не можете передать Elvis.class и ожидать, что он найдет свойство (если только он не закодирован специально для поиска статические свойства классов).

В основном вы используете шаблон singleton только при хочу экземпляре. Если вам подходят статические методы, просто используйте их и не беспокойтесь о перечислении.

Почему бы не заняться перечислением? Есть ли лучший способ делать синглтоны в java 5?

jontro 10.11.2011 18:57

@jontro (повторно) прочтите ответ; он говорит использовать перечисления, когда у вас должен быть синглтон, но избегать синглтона, если вы можете обойтись статическими методами

Miserable Variable 18.01.2013 02:53

@MiserableVariable Я прокомментировал это больше года назад. Не могу вспомнить, о каком контексте я имел в виду.

jontro 18.01.2013 15:00

не отвечает на заданный вопрос

Thufir 03.09.2013 03:03

@Thufir: Он отвечает на часть «в чем разница», которая, по-видимому, была тем, что больше всего интересовало ОП, учитывая, что ответ был принят.

Jon Skeet 03.09.2013 10:36

@Jon, и в чем преимущество использования одноэлементного шаблона перечисления по сравнению с использованием одноэлементного шаблона обычного класса Java?

Lin Ma 27.03.2015 02:29

@LinMa: Он лучше работает с сериализацией, помимо всего прочего. Эффективная версия Java 2 содержит более подробную информацию.

Jon Skeet 27.03.2015 09:45

Спасибо, @Jon, какую конкретную часть Effective Java 2nd edition вы имеете в виду? Спасибо.

Lin Ma 28.03.2015 01:03

@LinMa: я не могу вспомнить конкретный номер раздела, но есть часть, которая явно рекомендует использовать перечисления для синглтонов с подробными причинами.

Jon Skeet 28.03.2015 01:08

@ Джон, не беспокойся, я найду книгу. Хороших выходных.

Lin Ma 28.03.2015 10:41

@Jon, я позаимствовал книгу Effective Java edition 2, просмотрел разделы Enum (глава 6) и Serialization (глава 11), но не получил никаких подробностей о преимуществах использования Enum для сериализации. Если у вас есть более подробная информация, благодарю за обмен. Хороших выходных. :)

Lin Ma 05.04.2015 22:23

@LinMa: пункт 3 не дает столько подробностей, как я надеялся, но говорит: «Этот подход [перечисления] функционально эквивалентен подходу с общедоступными полями, за исключением того, что он более краток, бесплатно предоставляет механизм сериализации, и обеспечивает надежную гарантию против множественного создания экземпляров даже перед лицом изощренных атак сериализации или отражения ". (Непосредственно перед этим он дает пример кода сериализации, который вы должны написать, чтобы сделать сериализуемый синглтон в случае, отличном от перечисления.)

Jon Skeet 06.04.2015 11:34

@Lin: Эффективная Java написана в пунктах ... Это в пункте 3.

Jon Skeet 08.04.2015 08:26

@Jon, извини, задал глупый вопрос. Я прочитал раздел в книге, и там сказано, что он предлагает бесплатную сериализацию для INSTANCE enum, что это значит?

Lin Ma 10.04.2015 23:53

@LinMa: это означает, что если вы сериализуете экземпляр, а затем десериализуете, одноэлементный характер будет сохранен (т.е. вы все равно получите ссылку на экземпляр, на который будет ссылаться другой код). Если есть еще вопросы, предлагаю задать в новом посте.

Jon Skeet 10.04.2015 23:58

@Jon, конечно и последую твоему совету. Обсудим тут => stackoverflow.com/questions/29585510/instance-in-a-java-enum‌, хороших выходных. :)

Lin Ma 12.04.2015 06:05

(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. Я полагаю, если вам нужно было реализовать два интерфейса?

Sean Adkinson 17.07.2013 21:23

Я бы выбрал самый простой и понятный вариант. Это несколько субъективно, но если вы не знаете, что является наиболее ясным, выберите самый короткий вариант.

Другие вопросы по теме