重複コードがないことを確認するために、列挙型の状態を検証できるようにしたいと考えています。たとえば、以下の列挙型を考えてみましょう。
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)
aはすべてをキャッチするため、例外のスローは効果的ではありません。
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");
}
}
}
列挙型の定義が適切で、重複するコードがないことを証明する単体テストを作成できます。しかし、列挙型に一意のコードがない場合に動作しないように、自己テストとばかげた証明を行う方法はありますか?