15

私は次のように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は定数式です。

ここで何が起こっているのですか?

4

2 に答える 2

17

交換

 case MorrisBoard.RING.OUT:

 case Ring.OUT:

したがって、これは「コンパイル時に決定」のように実際には定数になります。

仕様は、「 SwitchLabel」が

  • case定数式が続く
  • case列挙値の名前が続く
  • またdefault

有効な定数式と見なされるものは、仕様のここに記載されています。かなり限定的です。

于 2013-01-13T21:04:05.177 に答える
8

この問題の簡単な解決策は次のとおりです。スイッチをクリックしてからCTL+1を押します。スイッチが if-else ブロック ステートメントに変更され、問題が解決されます。

于 2014-03-23T08:18:36.240 に答える