Окончательный переменный регистр в инструкции switch

        final int a = 1;
        final int b;
        b = 2;
        final int x = 0;

        switch (x) {
            case a:break;     // ok
            case b:break;     // compiler error: Constant expression required

        }
        /* COMPILER RESULT:
                constant expression required
                case b:break;
                     ^
                1 error
        */

Почему я получаю такую ​​ошибку? Если бы я сделал final int b = 2, все будет работать.

Ответ 1

b может быть не инициализирован, и ему может быть присвоено несколько значений. В вашем примере это, очевидно, инициализировано, но, вероятно, компилятор не узнает об этом (и не может). Представьте себе:

final int b;
if (something) {
   b = 1;
} else {
   b = 2;
}

Компилятор нуждается в константе в switch, но значение b зависит от некоторой внешней переменной.

Ответ 2

Случай в операторах switch должен быть константой в время компиляции. Команда

final int b=2

присваивает значение 2 b, прямо во время компиляции. Но следующая команда присваивает значение 2 - b в время выполнения.

final int b;
b = 2;

Таким образом, компилятор жалуется, когда он не может найти константу в одном из случаев инструкции switch.

Ответ 3

Конечная переменная без присвоенного ей значения называется пустой переменной. Пустой финал может быть назначен только один раз и должен быть не назначен при назначении или один раз в программе.

Для этого компилятор Java выполняет анализ потока, чтобы гарантировать, что для каждого присваивания пустой конечной переменной переменная определенно не назначена перед назначением; в противном случае возникает ошибка времени компиляции

Вот почему, когда компилятор компилирует конструкцию коммутатора, он бросает постоянное выражение, потому что значение b неизвестно компилятору.