Есть ли существенная причина использовать порядковый номер перечисления в регистре переключателей вместо использования перечисления?

Недавно я наткнулся на следующий пример:

CommandKey key = command.getKey();
    switch(key.ordinal()) {
    case 1:
        return IncidentType.StatusChange;
    case 2:
        return IncidentType.Notification;
    ...

Где ключ является перечислением.

Есть ли какая-то причина, по которой тот, кто написал это, сделал это так, потому что это делает код излишне хрупким; изменения значений в списке enum могут нарушить логику отображения и привести к неверному типу возвращаемого значения.
Единственное возможное преимущество, которое я вижу, - это небольшое повышение производительности, которое в контексте сервера с высокой пропускной способностью может оправдать принятую методологию.

Стоит ли какое-либо возможное повышение производительности, и есть ли другие преимущества, о которых я не знаю?

2 ответа

Решение

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

Лучшим решением было бы встроить возвращаемые значения в Enum сам.

Нет, это не должно использоваться. Наиболее благотворительная интерпретация заключается в том, что кто-то слепо копировал код из C или C++ с #defineс, но это должно было быть сделано идиоматическим.

Кроме того, в случае, описанном в вопросе (понимание того, что реальный код может быть более сложным), это лучше всего решить с помощью простого EnumMap, что было бы гораздо более производительным, чем любая ветвь.

Другие вопросы по тегам