是否有任何重要的理由在开关案例中使用枚举的序数,而不是使用枚举?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否有任何重要的理由在开关案例中使用枚举的序数,而不是使用枚举?相关的知识,希望对你有一定的参考价值。

我最近遇到了以下示例:

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

密钥是枚举的地方。

有没有理由为什么写这篇文章的人都是这样做的,因为这似乎会使代码变得不必要地变脆;对枚举列表值的更改可能会破坏映射逻辑并导致返回类型不正确。 我能看到的唯一可能的好处是轻微的性能提升,在具有高吞吐量的服务器环境中可以证明采用的方法是合理的。

是否有任何可能的性能提升,还有其他任何我不知道的好处吗?

答案

反对它的理由很充分。这些序数可以随时改变而不会破坏二进制兼容性。这些名字根本无法改变。

更好的解决方案是将返回值构建到Enum本身。

另一答案

不,这不应该使用。最慈善的解释是有人盲目地用#defines从C或C ++中复制代码,但它应该是惯用的。

此外,在问题中概述的情况下(理解真实代码可能更复杂),最好用简单的EnumMap解决,这比任何分支都要高得多。

以上是关于是否有任何重要的理由在开关案例中使用枚举的序数,而不是使用枚举?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在枚举关联值条件和另一个枚举案例之间编写复合开关案例?

是否有任何理由在 grails 中使用通过 TagLibs 公开给定库的 JavaScript 库插件,而不是直接使用它?

是否有任何理由使用 (nr & 1 == 0) 而不是 (nr % 2 == 0) 来检查奇偶校验?

是否有任何理由更喜欢在 IDE 中运行应用程序而不是运行独立的可执行文件?

是否有任何理由使用一个 DataContext 实例,而不是几个?

在C ++中,是否有任何理由产生并立即加入一个线程,而不是直接调用该函数?