假设我有一个Color包含2个可能值的枚举:RED和BLUE:
public enum Color {
RED,
BLUE
}
Run Code Online (Sandbox Code Playgroud)
现在假设我有一个这个枚举的switch语句,其中我有两个可能值的代码:
Color color = getColor(); // a method which returns a value of enum "Color"
switch (color) {
case RED:
...
break;
case BLUE:
...
break;
default:
break;
}
Run Code Online (Sandbox Code Playgroud)
由于我对枚举的两个可能值都有代码块,default上面代码中的用法是什么?
如果代码以某种方式到达default块,我应该抛出异常吗?
Color color = getColor(); // a method which returns a value of enum "Color"
switch (color) {
case RED:
...
break;
case BLUE:
...
break;
default:
throw new IllegalArgumentException("This should not …Run Code Online (Sandbox Code Playgroud) 通常,switch语句中不需要default.但是,在以下情况下,代码只有在取消注释默认语句时才能成功编译.谁能解释为什么?
public enum XYZ {A,B};
public static String testSwitch(XYZ xyz)
{
switch(xyz)
{
case A:
return "A";
case B:
//default:
return "B";
}
}
Run Code Online (Sandbox Code Playgroud) 当 switch 分支调用具有 void 返回类型的方法时,有没有办法强制对所有枚举值进行彻底检查?仅仅为了诱使编译器要求穷举而对产量进行硬编码是非常丑陋的。
这是我当前的模式(句柄方法具有 void 返回类型)
int unused = switch (event.getEventType()) {
case ORDER -> { handle((OrderEvent) event); yield 0; }
case INVOICE -> { handle((InvoiceEvent) event); yield 0; }
case PAYMENT -> { handle((PaymentEvent) event); yield 0; }
};
Run Code Online (Sandbox Code Playgroud)
我想使用表达式的原因是在添加新枚举值但未处理时出现编译错误。
是否有注释或其他方法将非详尽的switch语句警告转换为错误?如果没有在开关中正确处理所有值,我想要某个方法或类产生错误.
例:
public enum E {
A,
B
}
Run Code Online (Sandbox Code Playgroud)
在代码的其他地方,有一个像这样的枚举的开关
switch (enumValue) {
case A: /* do something */ break;
}
Run Code Online (Sandbox Code Playgroud)
Java会向您发出警告,指示此开关不处理所有枚举值.我想将此警告变为错误(永久,无论各个IDE设置如何).
请记住,在这种情况下我无法更改原始文件enum,所以我希望编译器强制执行它.
我不时要在项目的枚举类型中添加一个新值.
public enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY,
FILENOTFOUND //this one is new one
}
Run Code Online (Sandbox Code Playgroud)
我想要的是每个我没有处理新值的开关都有编译时错误,如下所示:
switch (color) {
case MONDAY:
case TUESDAY:
case WEDNESDAY:
case THURSDAY:
System.out.println("Mondays are bad.");
break;
case FRIDAY: System.out.println("Fridays are better.");
break;
case SATURDAY:
case SUNDAY: System.out.println("Weekends are best.");
break;
}
Run Code Online (Sandbox Code Playgroud)
有一个默认:抛出一些异常是不够好的,我希望它是编译时间.
我不认为这是可能的,但也许有人有一个巧妙的把戏......
我认为Findbugs有一个规则可以找到那些,但我只看到了这个: Eq:为枚举定义的协变equals()方法(EQ_DONT_DEFINE_EQUALS_FOR_ENUM)
编辑:我选择了马克的回复,我确实使用了Eclipse,听起来就像我需要的那样!我根本不是findbugs的专家,所以我可能错过了这样的功能,尽管我不这么认为.
假设你有一个包含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中添加和删除运行时枚举的元素.由于答案是"否",这意味着应该可以在编译时知道枚举的所有值,因此我要求编译器/某些代码分析工具可以实现, ?
编译器声称在结尾处缺少return语句MyClass.parse().这是代码:
package de.hs_rm.safelyovertaken.ble;
import android.support.annotation.NonNull;
import java.util.Arrays;
class MyClass {
@NonNull
static MyClass parse(byte[] encoded) throws MyParseException {
MyEnum myEnum = MyEnum.parse(Arrays.copyOfRange(encoded, 0, 2));
switch (myEnum) {
case A:
return new MyClassA();
case B:
return new MyClassB();
case C:
return new MyClassC();
}
// compile error: "Missing return statement"
// return null; // should never be reached
// throw new AssertionError("Should never be reached");
}
}
enum MyEnum {
A, B, C;
@NonNull
static MyEnum parse(byte[] encoded) throws …Run Code Online (Sandbox Code Playgroud)