Подтвердить что ты не робот

Выражения case должны быть постоянными выражениями для статического окончательного int?

У меня есть 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 является постоянным выражением.

Что здесь происходит?

4b9b3361

Ответ 1

Заменить

 case MorrisBoard.RING.OUT:

с

 case Ring.OUT:

Так что это будет действительно константа, как в "Определенная при компиляции".

В спецификации указано, что "SwitchLabel" должен быть

  • case, за которым следует постоянное выражение
  • case, за которым следует имя значения enum
  • или default

То, что считается действительным постоянным выражением, описано здесь в спецификации. Это довольно ограничено.

Ответ 2

Простое решение этой проблемы: Нажмите переключатель , а затем нажмите CTL + 1,. Он изменит ваш переключатель на оператор блока if-else и решит вашу проблему.