Когда можно использовать имя Enum ()

Имя переменных может быть изменено и не должно влиять на логику. Но метод name() в Enum возвращает имя константы в качестве значения, поэтому он может нарушить существующий код. Следует ли мне избегать использования name()?

Например,

public enum Example1 {FOO, BAR}

Рефакторинг имени FOO в FOO2 притормозит Example1.FOO.name().equals("FOO").

public enum Example2 {
    FOO("FOO"),
    BAR("BAR");

    String code;

    private Example2(final String code) {
        this.code = code;
    }

    public String getCode() {
        return code;
    }
}

В этом случае изменение имени FOO на FOO2 не приведет к остановке Example2.FOO.getCode().equals("FOO").

Для чего бы вы написали Example1.FOO.name().equals("FOO")?

ruakh 14.09.2018 09:14

Метод name() возвращает имя значения перечисления. Если вам нужна читаемая строка, используйте toString() (который по умолчанию возвращает имя).

Robert Kock 14.09.2018 09:15
But name() method in Enum returns a variable name as a value so it can break existing code. Как вы думаете, вы можете изменить название "FOO"?
Jude Niroshan 14.09.2018 09:15

@ruakh чтение значений из параметров URL например

user2652379 14.09.2018 09:16

В этом случае вам следует рассмотреть возможность использования выключатель

Jude Niroshan 14.09.2018 09:16

@JudeNiroshan Это может быть правильно в случае. Но в моем случае мне нужно только знать, имеет значение «FOO» или нет.

user2652379 14.09.2018 09:19

Я избегаю использования .name(), учитывая то, что написано в javadoc

Joakim Danielson 14.09.2018 09:19
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
7
688
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

При использовании типа перечисления я всегда сравниваю само перечисление, но не имя (строку) перечисления.

Example2.FOO.equals(Example2.getEnumByName("FOO"));

Я получил строковые значения из параметров URL. Его можно преобразовать в значение перечисления, но параметры легко настраиваются клиентами. Поэтому я предпочитаю сравнивать строки в этом случае.

user2652379 14.09.2018 09:35

Вопрос заключается в переименовании константы перечисления в исходном коде (AKA рефакторинг ее) без нарушения какого-либо кода, который полагался на это имя. Здесь код будет сломан так же, как при использовании Example1.FOO.name().equals("FOO").

Tomasz Linkowski 14.09.2018 10:05
Ответ принят как подходящий
  • Бизнес-логика должен использовать значение перечисления, а не name() напрямую. Причина: даже если имя изменится, семантика (то же значение перечисления, что и раньше) останется прежней.
  • name() используется при значениях сериализация / десериализация. Это влияет на базу данных (при использовании имен для сопоставления O / R), сериализованные данные, хранящиеся в файлах или передаваемые по сети (сериализация JSON / XML / YAML / ...), записи журнала и многое другое.
    Изменение имени может потребовать переноса данных или адаптации стороннего кода.

То же самое применимо к методам valueOf и toString?

user2652379 14.09.2018 10:47

valueOf напрямую связан с именем, и ни name (), ни valueOf () не могут быть переопределены, поэтому: yes. toString, с другой стороны, можно переопределить и использовать для отображения дополнительной информации / полей перечисления.

Peter Walser 14.09.2018 11:01

Ваше подозрение, что использовать его в целом неразумно из-за утечки информации о реализации, верно. Если бы у вас был цвет enum со значением RED, было бы неправильно сообщать пользователю программы цвет чего-либо с помощью colour.name(), потому что пользователю может потребоваться сообщение на языке, отличном от английского, и текст ВСЕ ЗАГЛАВНЫМИ буквами обычно будет неприемлемым. .

Можно использовать его в коде, используемом программистами для устранения проблем. Например, сообщения об исключениях, потому что они не должны быть представлены обычным пользователям программы.

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