Есть ли существенная причина использовать порядковый номер перечисления в регистре переключателей вместо использования перечисления?
Недавно я наткнулся на следующий пример:
CommandKey key = command.getKey();
switch(key.ordinal()) {
case 1:
return IncidentType.StatusChange;
case 2:
return IncidentType.Notification;
...
Где ключ является перечислением.
Есть ли какая-то причина, по которой тот, кто написал это, сделал это так, потому что это делает код излишне хрупким; изменения значений в списке enum могут нарушить логику отображения и привести к неверному типу возвращаемого значения.
Единственное возможное преимущество, которое я вижу, - это небольшое повышение производительности, которое в контексте сервера с высокой пропускной способностью может оправдать принятую методологию.
Стоит ли какое-либо возможное повышение производительности, и есть ли другие преимущества, о которых я не знаю?
2 ответа
Есть веская причина против этого. Порядковые числа могут меняться в любое время, не нарушая даже двоичную совместимость. Имена не могут так измениться вообще.
Лучшим решением было бы встроить возвращаемые значения в Enum
сам.
Нет, это не должно использоваться. Наиболее благотворительная интерпретация заключается в том, что кто-то слепо копировал код из C или C++ с #define
с, но это должно было быть сделано идиоматическим.
Кроме того, в случае, описанном в вопросе (понимание того, что реальный код может быть более сложным), это лучше всего решить с помощью простого EnumMap
, что было бы гораздо более производительным, чем любая ветвь.