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


Имя переменных может быть изменено и не должно влиять на логику. Но метод 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 3

3 ответа:

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

Ваше подозрение, что неразумно использовать его вообще, потому что он пропускает детали реализации, правильно. Если у вас есть цвет enum со значением RED, было бы неправильно сообщать пользователю программы цвет чего-либо с помощью colour.name(), потому что пользователю может понадобиться сообщение на другом языке, а не на английском, и весь текст CAPS обычно будет неуместен.

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

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

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