java - 如何验证 java 枚举的状态?

标签 java

我希望能够验证枚举的状态以确保没有重复的代码。例如,考虑下面的枚举。

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 测试并且万无一失,这样如果枚举没有唯一的代码,事情就不会运行?

最佳答案

几点:

  1. 为此,使用集合比使用 map 更简单。
  2. 从类的静态 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/

相关文章:

java.net.BindException :JVM Bind

java - 从 retrofit 查询中获取 map

java - 将用 C 编写的 CRC 8 函数转换为 Java

java - PrimeFaces 中的单元格编辑为 null

java - 在 maven 中测试时 Spring-Data h2 : java. io.FileNotFoundException

java - 弹出文本字段 Java

java - 在java中我有一个bean对象(类型未知)我想将它的成员放入一个散列图中

java - 致命异常 : main and Null pointer exception arise while running a simple android program

java - 为什么 Java 不接受我的 Generic LinkedList,却接受它自己的 LinkedList?

java - 从 solrj 迁移到 spring-data-solr