一尘不染

如何在编译时确保枚举开关的完整性?

java

我有几个测试一个的switch语句enum。所有enum值必须在switch语句中由case语句处理。在代码重构期间,可能会发生enum收缩和增长。当enum收缩时,编译器将引发错误。但是,如果enum增长,则不会引发任何错误。匹配状态被遗忘并产生运行时错误。我想将此错误从运行时移到编译时。从理论上讲,应该可以enum在编译时检测到丢失的情况。有什么办法可以做到这一点?


阅读 190

收藏
2020-09-08

共1个答案

一尘不染

另一种解决方案使用功能方法。您只需要根据下一个模板声明枚举类:

public enum Direction {

    UNKNOWN,
    FORWARD,
    BACKWARD;

    public interface SwitchResult {
        public void UNKNOWN();
        public void FORWARD();
        public void BACKWARD();
    }

    public void switchValue(SwitchResult result) {
        switch (this) {
            case UNKNOWN:
                result.UNKNOWN();
                break;
            case FORWARD:
                result.FORWARD();
                break;
            case BACKWARD:
                result.BACKWARD();
                break;
        }
    }
}

如果尝试至少在没有一个枚举常量的情况下使用此函数,则会出现编译错误:

getDirection().switchValue(new Direction.SwitchResult() {
    public void UNKNOWN() { /* */ }
    public void FORWARD() { /* */ }
    // public void BACKWARD() { /* */ } // <- Compilation error if missing
});
2020-09-08