Имя переменных может быть изменено и не должно влиять на логику. Но метод 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").
Метод name() возвращает имя значения перечисления. Если вам нужна читаемая строка, используйте toString() (который по умолчанию возвращает имя).
But name() method in Enum returns a variable name as a value so it can break existing code. Как вы думаете, вы можете изменить название "FOO"?
@ruakh чтение значений из параметров URL например
В этом случае вам следует рассмотреть возможность использования выключатель
@JudeNiroshan Это может быть правильно в случае. Но в моем случае мне нужно только знать, имеет значение «FOO» или нет.
Я избегаю использования .name(), учитывая то, что написано в javadoc




При использовании типа перечисления я всегда сравниваю само перечисление, но не имя (строку) перечисления.
Example2.FOO.equals(Example2.getEnumByName("FOO"));
Я получил строковые значения из параметров URL. Его можно преобразовать в значение перечисления, но параметры легко настраиваются клиентами. Поэтому я предпочитаю сравнивать строки в этом случае.
Вопрос заключается в переименовании константы перечисления в исходном коде (AKA рефакторинг ее) без нарушения какого-либо кода, который полагался на это имя. Здесь код будет сломан так же, как при использовании Example1.FOO.name().equals("FOO").
name() напрямую. Причина: даже если имя изменится, семантика (то же значение перечисления, что и раньше) останется прежней.name() используется при значениях сериализация / десериализация. Это влияет на базу данных (при использовании имен для сопоставления O / R), сериализованные данные, хранящиеся в файлах или передаваемые по сети (сериализация JSON / XML / YAML / ...), записи журнала и многое другое. То же самое применимо к методам valueOf и toString?
valueOf напрямую связан с именем, и ни name (), ни valueOf () не могут быть переопределены, поэтому: yes. toString, с другой стороны, можно переопределить и использовать для отображения дополнительной информации / полей перечисления.
Ваше подозрение, что использовать его в целом неразумно из-за утечки информации о реализации, верно. Если бы у вас был цвет enum со значением RED, было бы неправильно сообщать пользователю программы цвет чего-либо с помощью colour.name(), потому что пользователю может потребоваться сообщение на языке, отличном от английского, и текст ВСЕ ЗАГЛАВНЫМИ буквами обычно будет неприемлемым. .
Можно использовать его в коде, используемом программистами для устранения проблем. Например, сообщения об исключениях, потому что они не должны быть представлены обычным пользователям программы.
Для чего бы вы написали
Example1.FOO.name().equals("FOO")?