Когда можно использовать имя перечисления()
Имя переменных может быть изменено и не должно влиять на логику. Но метод 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 обычно будет неуместен.Использовать его в коде, используемом программистами для отладки проблем, - это нормально. Например, сообщения об исключениях, поскольку они должны не предъявляться обычным пользователям программы .