【发布时间】:2016-03-15 15:44:54
【问题描述】:
Eclipse 迫使我对任何 switch 使用 default 案例,包括列出所有声明的 enum 值的案例,据称是因为语言规范 [1]。这是不幸的,因为并行开发该项目的 Android Studio 不会,并且自然会警告我所有 switches,如果 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 以及可能在整个代码中更多地成为令人讨厌的错误源,因为流控制发现它们很好。
【问题讨论】:
-
如果你定义了你自己的,你可以使用任何你想要的东西,但是你可能想要继承
RuntimeException,因为你不希望有throws规范来定义不应该发生的异常。跨度> -
这是not如何使用条件的完美示例。改为使用多态性并将字符串作为枚举实例的属性。
-
@skyking:我读到
Error没有被勾选,以免鼓励人们抓住它。 -
@TheVee 你可以定义像
RED("Red")这样的实例并添加一个构造函数private Color(String name)将参数分配给一个字段 - 然后在toString()中返回该字段。 -
Error没有被选中因为它意味着完全不同的东西。似乎你只熟悉 C 风格的枚举;阅读有关 Java 枚举的官方教程。用易于理解的例子清楚地解释了这一点。