case表达式必须是static final int的常量表达式?

我有一个final class Ring定义为:

 final class Ring { public static final int OUT = 3; public static final int MID = 2; public static final int IN = 1; } 

我还有一个public class MorrisBoard ,代码如下:

 public class MorrisBoard { public static final Ring RING = new Ring(); private boolean checkMillBy(int ring, int x, int y) { switch(ring) { case MorrisBoard.RING.OUT: //... case MorrisBoard.RING.MID: //etc. //... } return false; } 

MorrisBoard.RING.OUT引用了一个变量,该变量在程序的生命周期中是不可变的。 所有价值都是最终的。

但是,我仍然得到以下错误: case expressions must be constant expressions 。 我对此感到困惑MorrisBoard.RING.OUT是一个常量表达式。

这里发生了什么?

更换

  case MorrisBoard.RING.OUT: 

  case Ring.OUT: 

所以这将是一个常数,如“在汇编时确定”。

规范预先确定“SwitchLabel”必须是

  • case后跟一个常量表达式
  • case后跟枚举值的名称
  • default

在本说明书中描述了被认为是有效的常量表达式。 它相当有限。

解决此问题的简单方法是:单击开关然后按CTL + 1,它会将您的开关更改为if-else阻止语句,并将解决您的问题