【发布时间】:2011-02-24 17:05:55
【问题描述】:
只是想对此事发表一些意见。我一直使用 int 标志,只是好奇如果我要在 Java 中使用枚举可能会带来易用性的性能吗?
【问题讨论】:
-
你说的是什么语言?例如,在 C# 中,它们是一回事。
标签: java int enumeration
只是想对此事发表一些意见。我一直使用 int 标志,只是好奇如果我要在 Java 中使用枚举可能会带来易用性的性能吗?
【问题讨论】:
标签: java int enumeration
我非常怀疑您会看到 性能 好处 - 在某些情况下,甚至可能会有性能损失,具体取决于您使用它们的方式。不过我怀疑它们会很重要。
好处不在于性能,而是在于更清楚地表达您的意图,从而使代码更具可读性(和类型安全)。例如,对于整数标志,如果您尝试在方法调用中使用(例如)HTTP_STATUS_UNAUTHORIZED 作为文件共享模式的值,则不会有任何抱怨......而如果这两个都是枚举,则参数将被强输入为 真的只允许文件共享模式(或者 null,诚然,假设您 正在谈论 Java)。
【讨论】:
像往常一样,Effective Java 说得最好:
使用
int枚举的程序 图案很脆。因为int枚举是编译时常量,它们 被编译到使用的客户端中 他们。如果int与 枚举常量被改变,它的客户 必须重新编译。如果他们不是, 他们仍然会运行,但他们的 行为将是未定义的。有 没有简单的方法来翻译
intenum 常量转换成可打印的字符串。如果 你打印这样一个常数或显示 它来自调试器,你所看到的只是一个 号,这不是很有帮助。 没有可靠的迭代方式 在所有int枚举常量中 组,甚至获得int枚举组。
(+ 10 页说明为什么枚举更好:-))
【讨论】:
枚举更清楚地表达了您正在尝试做的事情。使用它们,不用担心性能;性能影响可以忽略不计。
【讨论】:
使用位掩码标志的等效方法是使用 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
【讨论】:
除了枚举是自记录的之外,它们基本上是一样的。我建议在其他人可能与您的代码联系时立即使用枚举。
【讨论】:
一个Enum 一个有自己的方法和optimized containers 的类型。你应该更喜欢它而不是 int 标志,因为它更安全并且可能更有效(尽管我怀疑它有很多东西!)。
【讨论】:
除了类型安全的代码之外,您还有一个共享集合的单一引用(可重用性)
【讨论】: