2011-02-24 160 views
1

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

在此先感谢 〜Aedon

+2

你说什么语言呢?例如,在C#中它们是一样的。 – 2011-02-24 17:07:30

回答

12

我很怀疑你会看到性能好处 - 在某些情况下甚至会出现性能下降,这取决于你如何使用它们。我怀疑他们会很重要。

好处不在于性能方面 - 它更清楚地表达或表达您的意图,从而提高可读性(和类型安全性)的代码。例如,对于整数标志,如果您尝试在方法调用中使用(比如说)HTTP_STATUS_UNAUTHORIZED作为文件共享模式的值,则没有任何事情会抱怨...但是如果这两者都是枚举,则该参数将被强制键入为真的只允许文件共享模式(或空,假设你谈论Java)。

+0

谢谢您的回复;并注意到。 – AedonEtLIRA 2011-02-24 17:45:20

5

枚举更清晰地表达你正在尝试做什么。使用它们,不用担心性能;性能影响可以忽略不计。

0

它们基本上是一样的东西,除非枚举是自我记录的。我建议一旦其他人可能与您的代码联系,就使用枚举。

+3

Java枚举与整数非常不一样。他们比这更强大(而且比大多数其他语言中的枚举更强大)。 – 2011-02-24 17:11:06

+0

你说得对,他们更强大,是类型安全的。我可能没有充分表达的是,用枚举明显替换int标志将产生相同的结果,除了以更可读的方式。 – 2011-02-24 17:14:41

0

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

0

除了类型安全的代码,你有一个参考共享集合(可重用性)

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 
6

像往常一样,Effective Java最好说它:使用该int枚举 模式

程序是易碎的。因为int 枚举是编译时常量,所以它们 被编译到使用 它们的客户端中。如果与 枚举常量关联的int更改了,则必须重新编译其客户端 。如果它们不是, 它们仍然会运行,但它们的 行为将是未定义的。

有 不容易的方法将int枚举 常量转换成可打印的字符串。如果 您打印这样一个常数或从调试器显示它 ,你看到的只是一个 数字,这不是很有帮助。 有迭代 在所有int枚举常数在 基,或甚至以获得 一个int枚举组大小没有可靠的方法。

(+ 10多页的为什么枚举更好:-))

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

+0

谢谢你,这是高度描述性的。 – AedonEtLIRA 2011-02-24 19:20:43