首页 > 解决方案 > 枚举穷举switch语句的静态分析

问题描述

考虑以下代码:

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 语句的静态分析是否知道,在穷举 switch 中返回时,switch 语句之后的代码块是不可达的?

我尝试查看语言规范,但我没有清楚地看到这一点。

标签: javaswitch-statementspecifications

解决方案


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

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

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


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

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

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


推荐阅读