【问题标题】:Enumerations vs int flags?枚举与 int 标志?
【发布时间】:2011-02-24 17:05:55
【问题描述】:

只是想对此事发表一些意见。我一直使用 int 标志,只是好奇如果我要在 Java 中使用枚举可能会带来易用性的性能吗?

【问题讨论】:

  • 你说的是什么语言?例如,在 C# 中,它们是一回事。

标签: java int enumeration


【解决方案1】:

我非常怀疑您会看到 性能 好处 - 在某些情况下,甚至可能会有性能损失,具体取决于您使用它们的方式。不过我怀疑它们会很重要。

好处不在于性能,而是在于更清楚地表达您的意图,从而使代码更具可读性(和类型安全)。例如,对于整数标志,如果您尝试在方法调用中使用(例如)HTTP_STATUS_UNAUTHORIZED 作为文件共享模式的值,则不会有任何抱怨......而如果这两个都是枚举,则参数将被强输入为 真的只允许文件共享模式(或者 null,诚然,假设您 正在谈论 Java)。

【讨论】:

  • 感谢您的回复;并注明。
【解决方案2】:

像往常一样,Effective Java 说得最好:

使用int 枚举的程序 图案很脆。因为int 枚举是编译时常量,它们 被编译到使用的客户端中 他们。如果int 与 枚举常量被改变,它的客户 必须重新编译。如果他们不是, 他们仍然会运行,但他们的 行为将是未定义的。

有 没有简单的方法来翻译int enum 常量转换成可打印的字符串。如果 你打印这样一个常数或显示 它来自调试器,你所看到的只是一个 号,这不是很有帮助。 没有可靠的迭代方式 在所有 int 枚举常量中 组,甚至获得 int 枚举组。

(+ 10 页说明为什么枚举更好:-))

来源: Item 30: Use enums instead of int constants

【讨论】:

  • 谢谢你,它的描述性很强。
【解决方案3】:

枚举更清楚地表达了您正在尝试做的事情。使用它们,不用担心性能;性能影响可以忽略不计。

【讨论】:

    【解决方案4】:

    使用位掩码标志的等效方法是使用 EnumSet(恰好使用位掩码)

    enum Colour { RED, GREEN, BLUE }
    Set<Colour> colours = EnumSet.noneOf(Colour.class);
    colours.add(Colour.RED);
    colours.add(Colour.GREEN);
    if (colours.contains(Colour.RED)) // true
       System.out.println(colours+" contains RED");
    
    if (colours.contains(Colour.BLUE)) // false
    

    【讨论】:

      【解决方案5】:

      除了枚举是自记录的之外,它们基本上是一样的。我建议在其他人可能与您的代码联系时立即使用枚举。

      【讨论】:

      • Java 枚举与整数非常不同。它们比这更强大(并且比大多数其他语言中的枚举)。
      • 你是对的,它们更强大并且是类型安全的。我可能没有充分表达的是,用枚举简单地替换 int 标志将产生相同的结果,除了以更易读的方式。
      【解决方案6】:

      一个Enum 一个有自己的方法和optimized containers 的类型。你应该更喜欢它而不是 int 标志,因为它更安全并且可能更有效(尽管我怀疑它有很多东西!)。

      【讨论】:

        【解决方案7】:

        除了类型安全的代码之外,您还有一个共享集合的单一引用(可重用性)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-01-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-24
          • 1970-01-01
          相关资源
          最近更新 更多