假设我有一个包含 2 个可能值的枚举颜色
:红色
和蓝色
:
public enum Color {
RED,
BLUE
}
现在假设我有一个这个枚举的switch语句,其中有两个可能值的代码:
Color color = getColor(); // a method which returns a value of enum "Color"
switch (color) {
case RED:
...
break;
case BLUE:
...
break;
default:
break;
}
由于我有枚举的两个可能值的代码块,因此在上面的代码中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 have happened");
}
交换机案例的编译时完整性不能保证运行时的完整性。
具有针对较旧版本的枚举编译的 switch 语句的类可以使用较新的枚举版本(具有更多值)执行。这是库依赖项的常见情况。
出于类似的原因,编译器认为没有< code>default的< code>switch是不完整的。
其他答案是正确的,即您应该实现一个引发异常的默认
分支,以防将来向枚举添加新值。但是,我会更进一步,质疑为什么你甚至首先使用switch
语句。
与C和C#等语言不同,Java将枚举值表示为实际对象,这意味着您可以利用面向对象编程。假设您的方法的目的是为每种颜色提供RGB值:
switch (color)
case RED:
return "#ff0000";
...
好吧,可以说,如果你想让每种颜色都有一个RGB值,你应该把它作为描述的一部分:
public enum Color
{
RED("#FF0000"),
BLUE("#0000FF");
String rgb;
public Color(String rgb) {
this.rgb = rgb;
}
public getRgb() { return this.rgb; }
}
这样,如果您以后添加新的颜色,您将被迫提供一个RGB值。它甚至比另一种方法更容易失败,因为您将在编译时而不是运行时失败。
请注意,如果需要的话,您可以做更复杂的事情,包括让每种颜色提供自己的抽象方法的自定义实现。Java中的枚举非常强大,而且是面向对象的,在大多数情况下,我发现我可以避免一开始就需要< code>switch它们。
如第二个示例所示,抛出异常是一个很好的做法。通过快速失败来提高代码的可维护性。
在这种情况下,这意味着如果您稍后(可能几年后)添加一个枚举值,并且它到达switch语句,您将立即发现错误。
如果未设置默认值,即使使用新的枚举值,代码也可能会运行,并且可能具有不希望的行为。
问题内容: 通常,在switch语句中不需要默认值。但是,在以下情况下,仅当我取消注释默认语句时,代码才能成功编译。有人可以解释为什么吗? 问题答案: 您必须取消注释的原因是您的函数说它返回一个,但是如果您只为定义了标签,那么如果您传入其他任何内容,该函数将不会返回值。Java要求所有声明它们返回值的函数实际上在所有可能的控制路径上都返回一个值,并且在您的情况下,编译器不确信所有可能的输入都返回了
问题内容: 我们有一个带有枚举字段-的实体,我们想使用JPA注释-为它设置默认值。 但是,当我们将实体保存到数据库时,此字段的值为和。对于布尔字段- 正确的默认值()已保存。 如果改为使用:,则会在保存时得到以下异常: 我们做错了什么?为什么它仅适用于布尔值? 问题答案: 当某些SQL代码在未为emailCommunicationStatus列指定任何值的情况下插入一行时,您所做的工作很有用。在这
问题内容: 假设我有一个枚举,然后实例化一个天数组。 如何将一天(例如)设置为所有“天”的默认值?如果如上所述进行设置,则所有元素均为空。我希望通过枚举表现得更像ints和Strings,它们分别初始化为0和“”。 问题答案: 正如其他人所说,枚举是引用类型-它们只是特定类的编译器语法糖。JVM不了解它们。这意味着该类型的默认值为null。当然,这不仅会影响数组- 这意味着类型为枚举的任何字段的初
在Swift中,init(rawValue:)系统可确保将Int转换为enum会导致有效的enum case或nil。 Objective-C中没有这样的安全性,其中可以通过强制转换非成员“rawValue”来创建无效枚举成员。 打开枚举时,如果未处理枚举案例,编译器会警告您: 枚举值“third”未在开关中处理 但是,一旦处理完所有案例,就不会有类似的警告,表明对于枚举的无效成员仍然可能出现“默
我的api如下所示: 对于查询,我们只想允许查询枚举中列出的某些属性,如下所示: 我加了 在启动阶段。cs,但这不适用于默认值,我得到以下生成的虚张声势,默认值为0而不是字符串: 如何使默认值显示为字符串?