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");
        }
    }
}


我可以编写一个单元测试来证明枚举定义是好的,并且没有重复的代码。但是,是否有一种方法可以使其自我测试和傻瓜证明,以便在枚举没有唯一代码的情况下也不会运行?

最佳答案

要点:


为此,使用集合比映射更简单。
从类的静态块中抛出异常将是有效的,因为它将阻止类的加载。即使您故意使用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 - 如何使用@PersistenceContext批注的`properties`属性?

java - Android/Java asyncTask等待

java - 在使用Http连接时,在Java中,为什么在写之前总是要进行读调用?

java - ChangeListener不会更改JTextArea中的字体

通过 JPA 的 Java JTable 绑定(bind)

java - Android表 View

java - HIbernate 一对一注释不会在依赖表中生成外键 GerericGenerator

java - ServletContext资源中的XML文档无效

java - 不同尺寸屏幕的布局(Android)

java - Java中具有不同引用类型的对象类型的优点是什么?