有没有办法强制你在Java中切换枚举的所有定义值?

Jam*_* Ko 6 java enums switch-statement

假设你有一个包含3个值的枚举:

enum Colors { RED, GREEN, BLUE }
Run Code Online (Sandbox Code Playgroud)

你在某种方法中切换它的所有值,认为你已经处理了所有情况:

switch (colors) {
    case RED: ...
    case GREEN: ...
    case BLUE: ...
}
Run Code Online (Sandbox Code Playgroud)

然后,您在枚举中添加一个新值:

enum Colors { RED, GREEN, BLUE, YELLOW }
Run Code Online (Sandbox Code Playgroud)

除了你在方法中默默地错过一个案例之外,一切仍然编译得很好YELLOW.有没有办法在这种情况下引发编译时错误?


编辑:不明白为什么这被标记为欺骗我可以在Java中添加和删除运行时枚举的元素.由于答案是"否",这意味着应该可以在编译时知道枚举的所有值,因此我要求编译器/某些代码分析工具可以实现, ?

JB *_*zet 8

不,但是枚举是课程.所以你可以使用多态:

enum Color { 
    RED {
        @Override
        public void foo() { ... }
    },
    GREEN {
        @Override
        public void foo() { ... }
    },
    BLUE {
        @Override
        public void foo() { ... }
    };

    public abstract void foo();
}
Run Code Online (Sandbox Code Playgroud)

现在,如果添加颜色,编译器将不允许您添加它,它不会覆盖抽象方法.

而不是

switch (color) {
    case RED: ...
    case GREEN: ...
    case BLUE: ...
}
Run Code Online (Sandbox Code Playgroud)

你可以使用

color.foo();
Run Code Online (Sandbox Code Playgroud)

请注意,如果Kotlin是一个选项,Kotlin可以做你想要的.

另请注意,BLUE是一种颜色,而不是颜色.所以枚举应该命名为Color,而不是Colors.

  • 您可以使用访问者模式来使用多态,同时仍将逻辑排除在枚举之外。但是,如果您无法修改枚举,那么除了在运行时出现异常、单元测试或使用编译器进行该检查的语言之外,您无能为力。 (2认同)

Ral*_*off 6

这取决于编译器.可以将Eclipse IDE内置编译器配置为在这种情况下引发错误.

Windows/Preferences Java编译器错误/警告"enum上的'不完整'开关'情况"可以设置为"错误".

编辑:

甚至还有一个子选项"信号,即使存在'默认'的情况".