只是想就此事提出一些意见。我一直使用int标志,如果我在Java中使用枚举,只是对可能的易用性表现感到好奇吗?
答案 0 :(得分:12)
我非常怀疑你会看到性能的好处 - 在某些情况下甚至会有性能损失,具体取决于你如何使用它们。我怀疑它们是否具有重要意义。
好处不在于性能 - 它是用语言表达或更清楚地表达您的意图,从而产生更易读(和类型安全)的代码。例如,对于整数标志,如果您尝试在方法调用中使用(例如)HTTP_STATUS_UNAUTHORIZED作为文件共享模式的值,则不会抱怨...如果两者都是枚举,则参数将强烈键入< em>真的只允许文件共享模式(或者,假设你 谈论Java),那就是null。
答案 1 :(得分:6)
像往常一样,Effective Java说得最好:
使用
int
枚举的程序 图案很脆弱。因为int
枚举是编译时常量,它们 被编译到使用的客户端 他们。如果与int
相关联 枚举常数改变了,它的客户端 必须重新编译。如果他们不是, 他们仍然会跑,但他们的 行为将是不确定的。有 没有简单的方法来翻译
int
枚举 常量到可打印的字符串。如果 你打印这样一个常数或显示 它来自调试器,你看到的只是一个 号码,这不是很有帮助。 没有可靠的迭代方法 在...中的所有int
枚举常量 小组,甚至获得大小 一个int
枚举组。
(另外还有10页为什么枚举更好: - ))
答案 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)
除了类型安全的代码之外,您还有一个单一引用来共享集合(可重用性)