Когда можно использовать имя Enum () - PullRequest
0 голосов
/ 14 сентября 2018

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

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

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

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

0 голосов
/ 14 сентября 2018

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

Example2.FOO.equals(Example2.getEnumByName("FOO"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...