大小写表达式必须是静态 final int 的常量表达式?

2022-09-04 00:55:58

我有一个定义: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 expressionsMorrisBoard.RING.OUT

这是怎么回事?


答案 1

取代

 case MorrisBoard.RING.OUT:

 case Ring.OUT:

因此,这确实是一个常量,就像“编译时确定”一样。

该规范精确地指出,“SwitchLabel”必须是

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

规范中描述了被视为有效常量表达式的内容。这是相当有限的。


答案 2

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