枚举值()。长度与专用字段

我有这样的枚举:

public enum Configuration { XML(1), XSLT(10), TXT(100), HTML(2), DB(20); private final int id; private Configuration(int id) { this.id = id; } public int getId() { return id; } } 

有时我需要检查枚举中有多less个字段。 什么是最好的解决scheme? 我应该使用“values()。length”方法吗? 或者,也许,我必须像这样在枚举中创build常量字段:

 public enum Configuration { XML(1), XSLT(10), TXT(100), HTML(2), DB(20); private final int id; private Configuration(int id) { this.id = id; } public int getId() { return id; } public static final int Size = 5; } 

什么是最快和最优雅的解决scheme?

使用values().length会每次调用时创build一个新的数组副本。 我有时会创build自己的List (或设置,或映射,无论我需要什么),以避免这种毫无意义的复制。 我不会硬编码,但如果你只需要的大小,我只是使用:

 private static final int size = Configuration.values().length; 

最后。 在评估时,所有的值都将被初始化。 这就避免了其他答案中提出的DRY和不一致的问题。

当然,这本身就是一个微型优化…但最终以简单的代码结束,IMO。 从别处调用values().length并不能expression你感兴趣的东西,这只是枚举的大小 – 事实上,你通过一系列的值来获得它是偶然的和分散注意力的,IMO。

使用values()一个替代方法是使用EnumSet.allOf().size() ,对于小的枚举来说这将是非常便宜的 – 但是它不像只有一个size字段那样可读。

我会build议使用values().length 。 这是更加优雅,与使用常量相比,性能开销将可以忽略不计。 此外,您可以消除常数与枚举的实际长度不一致的风险。

通过存储计数,你违反了DRY原则 ,所以除非你有一个很好的理由,否则你不应该这么做。

另一种方法是在values()方法上使用一个常量初始化。

 public enum Colors { BLUE, GREEN, FUCHSIA; public static int COUNT = Colors.values().length; } 

这样你有一个自动更新的常量,并仍然避免“values()”开销。