我有这样的枚举:
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; }
}
有时我需要检查枚举中有多少个字段。什么是最好的解决方案? 我应该使用方法“values()。length”吗?或许,我必须在枚举中创建常量字段,如下所示:
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;
}
什么是最快,更优雅的解决方案?
答案 0 :(得分:100)
每次调用时,使用values().length
都会创建数组的新副本。我有时创建自己的List
(或设置,或地图,无论我需要什么)以避免这种无意义的复制。我不会对它进行硬编码...如果你只需要这个尺寸,我只会使用:
private static final int size = Configuration.values().length;
最后。到评估时,所有值都将被初始化。这避免了其他答案中提出的干扰和不一致问题。
当然,这本身就是一个微优化......但最终会以更简单的代码结束,IMO。从其他地方调用values().length
并不表达您感兴趣的内容,这只是只是枚举的大小 - 您通过一系列值获取它的事实是偶然的分散注意力,IMO。
使用values()
的替代方法是使用EnumSet.allOf().size()
,对于小型枚举来说,它会非常便宜 - 但同样,它不像只有size
字段那样可读。
答案 1 :(得分:9)
我建议使用values().length
。这更加优雅,与使用常量相比,性能开销可以忽略不计。此外,您可以消除常量与枚举的实际长度不一致的风险。
答案 2 :(得分:8)
通过存储你违反DRY principle的计数,所以除非你有充分的理由,否则你不应该这样做。
答案 3 :(得分:4)
另一种方法是使用在values()方法之上初始化的常量。
public enum Colors {
BLUE, GREEN, FUCHSIA;
public static int COUNT = Colors.values().length;
}
这样你就有了一个自动更新的常量,仍然可以避免这些" values()"开销。