Когда можно использовать имя 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")
,
3 ответа
- Бизнес-логика должна использовать значение перечисления, а не
name()
непосредственно. Причина: даже если имя изменяется, семантика (то же значение перечисления, что и раньше) остается прежней. name()
используется при сериализации / десериализации значений. Это влияет на базу данных (при использовании имен для сопоставления O/R), сериализованные данные, хранящиеся в файлах или передаваемые по проводам (сериализация JSON/XML/YAML/...), записи журнала и многое другое.
Изменение имени может потребовать переноса данных или адаптации в стороннем коде.
Ваше подозрение, что вообще нецелесообразно использовать его, потому что он дает утечку, является верной деталью реализации. Если бы у вас был цвет enum
с RED
значение, было бы неправильно сообщать пользователю программы цвет чего-то, используя colour.name()
потому что пользователю может понадобиться сообщение на другом языке, а текст ALL CAPS обычно не подходит.
Использование его в коде, используемом программистами для отладки проблем - это нормально. Такие как сообщения об исключениях, потому что они не должны быть представлены обычным пользователям программы.
При использовании типа enum я всегда сравниваю сам enum, но не имя enum (строка).
Example2.FOO.equals(Example2.getEnumByName("FOO"));