Eclipse迫使我对任何default
使用switch
个案,包括那些列出所有声明的enum
值的案例,据称是因为语言规范[1]。这是不幸的,因为项目是并行开发的Android Studio不会,并且自然会警告我switch
如果enum
被更改,那么enum
将变得不完整。虽然我更喜欢后一种行为,因为前者使Error
更改实际上更多容易出错(参见下面的示例),我无法选择,所以我需要找到如何这样做适合两者。我想如果代码中有一个地方应该在任何情况下仍然无法访问但仍然无法删除该行,那么抛出一个new Error("enum name")
似乎是很自然的事情。但是哪一个,是否有一个普遍接受的子类用于这种情况(可能延伸到其他“强制”无法到达的地方)?或者只是为了它而简单地抛出一个快速而肮脏的public static enum Color {
RED,
GREEN,
BLUE;
@Override
public String toString() {
switch(this) {
case RED:
return "Red";
case GREEN:
return "Green";
case BLUE:
return "Blue";
default:
/* never reached */
throw new ThisCanNeverHappenError();
}
}
}
,而不是仅仅为了从未使用过来自己编写它?
在示例中:
WHITE
将enum
添加到switch
会使这个CREATE TRIGGER COPY_UPDATED_USERNAME
AFTER UPDATE ON ALLUSERS
REFERENCING NEW AS NEWUSERNAME_ROW
FOR EACH ROW MODE DB2SQL
UPDATE ALLUSERS_MAINTABSPERMISSION SET USERNAME = NEWUSERNAME_ROW.USERNAME
以及可能更多的代码在整个代码中出现令人讨厌的错误,因为流控制会发现它们很好。
答案 0 :(得分:2)
答案 1 :(得分:1)
投掷Error
并不是一个非常明智的举动 - 大多数异常处理代码都会通过它们,它们最终会出现在奇怪的地方,可能会使您的进程无法使用。
我建议IllegalStateException
。
答案 2 :(得分:1)
如果将“toString”值添加为枚举实例的参数,则不需要此开关(以及默认情况的相应处理):
public static enum Color {
RED("Red"),
GREEN("Green"),
BLUE("Blue");
private final String name;
private Color(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
}
答案 3 :(得分:1)
你不应该抛出Error
。更好的例外应该是IllegalStateException
:
switch(this) {
case RED:
return "Red";
case GREEN:
return "Green";
case BLUE:
return "Blue";
default:
throw new IllegalStateException("Unexpected enum value: " + this.name());
}
另一方面,你不应该在那里使用switch
声明。在枚举中添加一个字段。另请注意,枚举始终为static
,因此您可以删除该关键字。
public enum Color {
RED ("Red"),
GREEN("Green"),
BLUE ("Blue");
private final String displayText;
private Color(String displayText) {
this.displayText = displayText;
}
public String getDisplayText() {
return this.displayText;
}
@Override
public String toString() {
return this.displayText;
}
}
答案 4 :(得分:1)
你正在做一个断言:/* never reached */
- 如果那个断言是错误的,你应该抛出一个AssertionError
。
抛出IllegalStateException
的替代建议并不合适 - 根据javadoc:
表示在非法或不适当的时间调用了某个方法
这不是真的。