java - 枚举的详尽 switch 语句的静态分析

标签 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 语句进行静态分析是否知道,在详尽的 switch 中返回时, switch 语句后面的代码块是无法访问的?

我尝试查看 language spec ,但我没有看到这一点得到明确解决。

最佳答案

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

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

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

<小时/>

顺便说一句:到目前为止,实现 foo 方法的最简单方法是

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

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

关于java - 枚举的详尽 switch 语句的静态分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50607799/

相关文章:

Java Swing : Alt-tab styled menu (context switching menu)

c# - 不在循环内执行switch语句,并且循环不循环

java - 关于线程和进程的一个问题

java - double 值返回 0

C#,使用反射获取switch中的每个case名称

opengl - 在 OpenGL 规范中哪里说 POINT 光栅化被裁剪到视口(viewport)?

.NET 4.5 MethodBuilder.SetMethodBody

CSS 规范 - 原子内联水平框

java - 在不使用 java.awt.Color 的情况下从 HSV(Java 中的 HSB)转换为 RGB(Google App Engine 不允许)

java - 如何将异常集合作为根本原因传递?