枚举的详尽切换语句的静态分析

时间:2018-05-30 14:55:57

标签: java switch-statement specifications

请考虑以下代码:

enum MyEnum {
  A, B, C;
}

int foo(MyEnum e) {
  switch (e) {
    case A:
      return 1;
    case B:
      return 2;
    case C:
      return 3;
  }
}
^ error: missing return statement

编译器不喜欢这个。将此示例与以下内容进行对比:

int bar() {
  if (...) {
    return 1;
  } else {
    return 2;
  }
}

切换问题可以通过default案例解决,但你可以说这里不需要。在切换的情况下涵盖所有枚举值。对switch语句的静态分析是否知道,在穷举交换机中返回后,switch语句后的代码块无法访问?

我试着查看language spec,但我没有清楚地看到这一点。

1 个答案:

答案 0 :(得分:0)

嗯,Java本身并不像其他语言(如C / C ++或.NET)那样实现枚举。它们只是(最终)类的实例。实际上,您的运算符==会比较引用相等而不是您可能建议的整数值。

这就是为什么switch语句不完整的原因。引用可能只是null

此外,您可能已经使用公共构造函数定义了自己的枚举类,该构造函数可能会创建任意数量的实例。

顺便说一下:实现foo方法的最简单方法是

int foo(MyEnum e)
{ return e.ordinal() + 1;
}

但请注意.ordinal()不会返回与枚举常量相关的任何值。它只是定义的索引。