Java枚举中的强制开关默认值

Java枚举中的强制开关默认值,java,enums,switch-statement,Java,Enums,Switch Statement,假设我创建了一个枚举,例如: public enum MyEnum { A, B, C; } 还有一个switch语句(如下所示),其中每个枚举值都有一个case语句,但我还包括了一个默认值,用于抛出一个IllegalArgumentException。(如果添加了一个新的枚举值,那么如果要传递新的值,则更有可能有人会注意到该case语句出现错误。我的想法是,异常比日志或尝试处理新的case要明显得多。) 理论上,除非我遗漏了什么,否则如果不添加新的枚举值或修改swit

假设我创建了一个枚举,例如:

public enum MyEnum {
    A,
    B,
    C;
}
还有一个switch语句(如下所示),其中每个枚举值都有一个case语句,但我还包括了一个默认值,用于抛出一个IllegalArgumentException。(如果添加了一个新的枚举值,那么如果要传递新的值,则更有可能有人会注意到该case语句出现错误。我的想法是,异常比日志或尝试处理新的case要明显得多。)

理论上,除非我遗漏了什么,否则如果不添加新的枚举值或修改switch语句,默认值应该是不可访问的


所以我想知道的是,如果我正在为代码覆盖率编写JUnit测试,有没有一种方法可以强制switch在不更新应用程序代码的情况下命中默认语句?

不可能像问题中所述,强制Java在switch语句中命中默认情况,也就是说,所有枚举值的大小写都有一个断开开关的大小写。

您可以尝试强制转换-
(MyEnum)-1但您可以使用多态性而不是switch语句来确保在编译时(而不是在运行时)覆盖每个枚举值。不,您不能。接受这一点。(推论:100%的代码覆盖率是一个神话。)@PhilipBrack不,那是不可能的。Java枚举与C/C#枚举不同。它们不能从简单的数字类型强制转换,因为它们甚至没有在内部表示为简单的数字类型。它们实际上是成熟的对象。@DodgyCodeException在枚举本身中添加一个抽象doSomething()方法,以强制每个枚举实现它。或者使用visitor模式将doSomething的实现放在enum之外。
switch(myEnum) {
    case A:
        //do something
        break;
    case B:
        //do something
        break;
    case C:
        //do something
        break;
    default:
        throw new IllegalArgumentException("Unrecognized enum type!");
}