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

时间:2013-01-13 21:02:27

标签: java switch-statement final

我将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是一个常量表达式。

这里发生了什么?

2 个答案:

答案 0 :(得分:16)

替换

 case MorrisBoard.RING.OUT:

 case Ring.OUT:

所以这真的是一个常数,就像“在汇编时决定”一样。

“SwitchLabel”必须为

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

什么被认为是有效的常量表达式described here in the specification。它相当有限。

答案 1 :(得分:3)

此问题的简单解决方案是: 点击开关,然后按 CTL + 1,它会将您的切换更改为if-else阻止声明,并将解决您的问题