Когда можно использовать имя 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"));
Другие вопросы по тегам