web-dev-qa-db-ja.com

ケース式は静的finalintの定数式でなければなりませんか?

私は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は定数式です。

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

13
user1131435

交換

 case MorrisBoard.RING.OUT:

 case Ring.OUT:

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

仕様 precises 「SwitchLabel」は

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

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

16
Denys Séguret

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

5
Pir Fahim Shah