我有这样的枚举:
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; }
}
Run Code Online (Sandbox Code Playgroud)
有时我需要检查枚举中有多少个字段.什么是最好的解决方案?我应该使用方法"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;
}
Run Code Online (Sandbox Code Playgroud)
什么是最快,更优雅的解决方案?
Jon*_*eet 102
values().length每次调用时,使用都会创建数组的新副本.我有时创建自己的List(或设置,或地图,无论我需要什么),以避免这种无意义的复制.我不会硬编码...如果你只需要这个尺寸,我只会使用:
private static final int size = Configuration.values().length;
Run Code Online (Sandbox Code Playgroud)
在末尾.到评估时,所有值都将被初始化.这避免了其他答案中提出的干扰和不一致问题.
当然,这本身就是一种微优化......但最终会以更简单的代码结束,IMO.values().length从其他地方打电话并不能表达你感兴趣的东西,这只是枚举的大小 - 你通过一系列价值得到它的事实是偶然的和分散注意力的,IMO.
使用的一种替代方法values()是使用EnumSet.allOf().size()对于小型枚举而言相当便宜 - 但同样,它不像只有一个size字段那样可读.
小智 6
另一种方法是使用在 values() 方法之上初始化的常量。
public enum Colors {
BLUE, GREEN, FUCHSIA;
public static int length = Colors.values().length;
}
Run Code Online (Sandbox Code Playgroud)
这样你就有了一个自动更新的常量,并且仍然避免了“values()”的开销。
| 归档时间: |
|
| 查看次数: |
58215 次 |
| 最近记录: |