Case expressions must be constant expressions for static final int?

蹲街弑〆低调 提交于 2020-01-01 08:03:18

问题


I have a final class Ring defined as:

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

I also have a public class MorrisBoard with the following code:

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 references a variable which is immutable for the lifetime of the program. All values are final.

However, I still get the following error: case expressions must be constant expressions. I'm confused by this - MorrisBoard.RING.OUT is a constant expression.

What is going on here?


回答1:


Replace

 case MorrisBoard.RING.OUT:

with

 case Ring.OUT:

So this will really be a constant as in "determined at compilation".

The specification precises that a "SwitchLabel" must be

  • case followed by a constant expression
  • case followed by the name of an enum value
  • or default

What is considered a valid constant expression is described here in the specification. It's fairly limited.




回答2:


Simple solution for this problem is : Click on the switch and then press CTL+1, It will change your switch to if-else block statement, and will resolve your problem



来源:https://stackoverflow.com/questions/14308129/case-expressions-must-be-constant-expressions-for-static-final-int

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!