(примечание: отредактированный вопрос, предварительное намерение не было ясно)
Рассмотрим этот код:
public final class Foo
{
private enum X
{
VALUE1, VALUE2
}
public static void main(final String... args)
{
final X x = X.VALUE1;
switch (x) {
case VALUE1:
System.out.println(1);
break;
case VALUE2:
System.out.println(2);
}
}
}
Этот код отлично работает.
Однако, если я заменю:
case VALUE1: // or VALUE2
с:
case X.VALUE1: // or X.VALUE2
тогда компилятор жалуется:
java:/path/to/Foo.java:whatever: метка case переключателя перечисления должна быть неквалифицированным именем константы перечисления
SO предлагает ответ с этой цитатой из JLS:
(Одна из причин необходимости встраивания констант заключается в том, что операторы switch требуют констант в каждом случае, и никакие два таких константных значения не могут быть одинаковыми. Компилятор проверяет повторяющиеся значения константы в объявлении switch во время компиляции, файл класса формат не выполняет символическую привязку значений case.)
Но это меня не удовлетворяет. Насколько мне известно, VALUE1
и X.VALUE1
точно совпадают. Котировочный текст мне не объясняет.
Где в JLS определено, что значения enum
в выражениях switch
должны быть записаны таким образом?