具有默认投掷条款的枚举?

时间:2010-05-20 19:07:53

标签: java enums java-5

我在这里的枚举部分的Java语言规范中注意到以下内容:link

switch(this) {
  case PLUS:   return x + y;
  case MINUS:  return x - y;
  case TIMES:  return x * y;
  case DIVIDE: return x / y;
}
throw new AssertionError("Unknown op: " + this);

但是,查看switch语句定义部分,我没有注意到这个特定的语法(关联的throw语句)。

我可以在枚举定义之外使用这种“默认情况是抛出异常”的语法糖吗?它有什么特别的名字吗?这被认为是短期削减“不在列表中的任何内容引发异常”的行为的好/坏做法吗?

5 个答案:

答案 0 :(得分:3)

关于抛出AssertionError的教程的作者感到羞耻 - 为什么不利用Java提供给我们的例外,例如UnsupportedOperationException

答案 1 :(得分:2)

我不确定我是否收到您,但您似乎相信throw是已发布代码示例中switch语法的一部分。事实并非如此。 switch块和throw语句是两个单独的东西,恰好在此代码中彼此相邻。

更详细:case中的四个switch部分都包含return语句,导致方法中的任何后续指令被跳过。如果case部分都不匹配,则会在switch块后面的行继续执行,该行恰好是throw

您可以在throw之后以非常类似的方式使用if

if (something) {
    return aValue;
}

throw new Exception("Nope");

答案 2 :(得分:0)

default个关键字:

switch (whatever) {
  // ...
  default: explode();
}

如果您希望默认情况下抛出异常,那么

  default: throw new Explode();

您的示例仅按其方式工作,因为所有其他分支都从包含函数返回。 在我看来,这不是一个很好的编码习惯。

答案 3 :(得分:0)

在eclipse中,如果你没有在switch语句中覆盖所有枚举值,它会在编译时生成警告。

但是,如果您提出警告不再有效的default:案例。所以,在某些IDE中,当switch语句中包含所有枚举值时,省略default的情况有明显的优势。

通常,如果您的switch语句超过5-6个案例,请考虑重新设计代码。通常,人们不理解Java中的枚举是完整的类,枚举值是第一类对象,因此在许多情况下,不是通过switch语句驱动行为,而是可以让enum对象自己完成工作。

在这个特定的例子中,枚举可以有一个方法doOp( int x, int y),每个枚举成员可以实现此方法的特定风格。

答案 4 :(得分:0)

正如其他人所说,这不是语法糖。它的工作原理是因为交换机上的所有分支都从该方法返回。如果将一些其他枚举值放入交换机,则switch语句将在不运行任何分支的情况下完成,之后将执行throw语句。

switch(this) {
  case PLUS:   return x + y;
  case MINUS:  return x - y;
  case TIMES:  return x * y;
  case DIVIDE: return x / y;
  default: throw new AssertionError("Unknown op: " + this);
}

该代码在功能上是等效的。两者之间的主要区别在于,如果将值添加到Enum而不是switch语句,则没有default子句的switch将创建编译器警告。

相关问题