枚举vs int标志?

时间:2011-02-24 17:05:56

标签: java int enumeration

只是想就此事提出一些意见。我一直使用int标志,如果我在Java中使用枚举,只是对可能的易用性表现感到好奇吗?

7 个答案:

答案 0 :(得分:12)

我非常怀疑你会看到性能的好处 - 在某些情况下甚至会有性能损失,具体取决于你如何使用它们。我怀疑它们是否具有重要意义。

好处不在于性能 - 它是用语言表达或更清楚地表达您的意图,从而产生更易读(和类型安全)的代码。例如,对于整数标志,如果您尝试在方法调用中使用(例如)HTTP_STATUS_UNAUTHORIZED作为文件共享模式的值,则不会抱怨...如果两者都是枚举,则参数将强烈键入< em>真的只允许文件共享模式(或者,假设你 谈论Java),那就是null。

答案 1 :(得分:6)

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

  

使用int枚举的程序   图案很脆弱。因为int   枚举是编译时常量,它们   被编译到使用的客户端   他们。如果与int相关联   枚举常数改变了,它的客户端   必须重新编译。如果他们不是,   他们仍然会跑,但他们的   行为将是不确定的。

     

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

(另外还有10页为什么枚举更好: - ))

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

答案 2 :(得分:5)

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

答案 3 :(得分:1)

使用位掩码标志的等价物是使用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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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