在 switch case 中使用枚举的序号而不是使用枚举有什么重要的理由吗?
Is there any significant reason to use the ordinal of an enum in a switch case, instead of using the enum?
我最近遇到了以下示例:
CommandKey key = command.getKey();
switch(key.ordinal()) {
case 1:
return IncidentType.StatusChange;
case 2:
return IncidentType.Notification;
...
其中键是一个枚举。
写这篇文章的人这样做有什么理由吗,因为这似乎会使代码变得不必要地脆弱;更改枚举列表的值可能会破坏映射逻辑并导致不正确的 return 类型。
我能看到的唯一可能的好处是性能略有提高,在具有高吞吐量的服务器的上下文中可以证明采用的方法是合理的。
任何可能的性能提升是否值得,还有我不知道的任何其他好处吗?
不,不应该使用它。最仁慈的解释是有人用 #define
盲目地从 C 或 C++ 复制代码,但它应该是惯用的。
此外,在问题中概述的情况下(了解实际代码可能更复杂),最好使用简单的 EnumMap
来解决,这将比任何方法都更高效分支.
反对 有充分的理由。序号可以随时更改,甚至不会破坏二进制兼容性。名字根本不能这么改。
更好的解决方案是将返回值构建到 Enum
本身。
我最近遇到了以下示例:
CommandKey key = command.getKey();
switch(key.ordinal()) {
case 1:
return IncidentType.StatusChange;
case 2:
return IncidentType.Notification;
...
其中键是一个枚举。
写这篇文章的人这样做有什么理由吗,因为这似乎会使代码变得不必要地脆弱;更改枚举列表的值可能会破坏映射逻辑并导致不正确的 return 类型。
我能看到的唯一可能的好处是性能略有提高,在具有高吞吐量的服务器的上下文中可以证明采用的方法是合理的。
任何可能的性能提升是否值得,还有我不知道的任何其他好处吗?
不,不应该使用它。最仁慈的解释是有人用 #define
盲目地从 C 或 C++ 复制代码,但它应该是惯用的。
此外,在问题中概述的情况下(了解实际代码可能更复杂),最好使用简单的 EnumMap
来解决,这将比任何方法都更高效分支.
反对 有充分的理由。序号可以随时更改,甚至不会破坏二进制兼容性。名字根本不能这么改。
更好的解决方案是将返回值构建到 Enum
本身。