我希望能够验证枚举的状态以确保没有重复的代码。例如,考虑下面的枚举。
public enum UniqueCodes {
A(1), B(2), C(3), D(1);
private final int value;
static {
UniqueCodes[] values = UniqueCodes.values();
Map<Integer, Boolean> map = new HashMap<>();
for (UniqueCodes code : values) {
if (map.get(code.value) == null) {
map.put(code.value, true);
} else {
String msg = String.format(
"%s enum contains a non unique code %s",
UniqueCodes.class.getName(), code.value);
System.err.println(msg);
try {
System.exit(-1);
} catch(SecurityException e) {
System.err.println("Really Bad things are going to happen to the application");
// what can I do here to crash the JVM
}
}
}
}
private UniqueCodes(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
想象一下上面的枚举分配了 100 多个代码,并且您想要确保没有枚举定义
包含重复值。如果检测到重复值,我想让 JVM 崩溃,但这并不容易做到。引发异常并不有效,因为 catch(Throwable e)
会捕获所有内容。
public class Main {
public static void main(String[] args) {
try {
System.out.println(UniqueCodes.A);
} catch(Throwable e) {
System.out.println("Invalid Enum exception caught");
}
}
}
我可以编写一个单元测试来证明枚举定义是好的并且没有重复的代码。但是有没有一种方法可以使其 self 测试并且万无一失,这样如果枚举没有唯一的代码,事情就不会运行?
最佳答案
几点:
- 为此,使用集合比使用 map 更简单。
- 从类的静态 block 中抛出异常将是有效的,因为它会阻止类的加载。即使您故意捕获并忽略第一个错误
catch (Throwable t)
,任何尝试使用“无效”枚举的后续代码都会自发抛出java.lang.NoClassDefFoundError
.
我将编写验证代码如下:
static {
Set<Integer> set = new HashSet<>();
for (UniqueCodes code : values()) {
if (!set.add(code.value)) {
throw new RuntimeException(String.format(
"%s enum contains a non unique code %s",
UniqueCodes.class.getName(), code.value));
}
}
}
附注如果您不需要唯一代码的任何特定值,您应该知道 Enum.ordinal()存在,它按照定义的顺序返回常量的从零开始的索引。
关于java - 如何验证 java 枚举的状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18543769/