Когда можно использовать имя перечисления()
Имя переменных может быть изменено и не должно влиять на логику. Но метод name()
в Enum возвращает постоянное имя в качестве значения, поэтому он может разбить существующий код. Следует ли мне избегать использования name()
?
Например,
public enum Example1 {FOO, BAR}
Рефакторинг FOO
name to 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")
.
3 ответа:
- бизнес-логика должна использовать значениеenum , а не
name()
напрямую. Причина: даже если имя изменяется, семантика (то же значение перечисления, что и раньше) остается прежней.name()
используется присериализации/десериализации значений . Это влияет на базу данных (при использовании имен для O / R сопоставления), сериализованные данные, хранящиеся в файлах или передаваемые по проводам (JSON/XML/YAML/... сериализация), записи в журнале и многое другое.
для изменения имени могут потребоваться данные миграция или адаптация в стороннем коде.
Ваше подозрение, что неразумно использовать его вообще, потому что он пропускает детали реализации, правильно. Если у вас есть цвет
enum
со значениемRED
, было бы неправильно сообщать пользователю программы цвет чего-либо с помощьюcolour.name()
, потому что пользователю может понадобиться сообщение на другом языке, а не на английском, и весь текст CAPS обычно будет неуместен.Использовать его в коде, используемом программистами для отладки проблем, - это нормально. Например, сообщения об исключениях, поскольку они должны не предъявляться обычным пользователям программы .