问题
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 expressioncase
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