Dlaczego nie można w pełni zakwalifikować wartości wyliczeniowej w instrukcji switch?
(uwaga: edytowane pytanie; wcześniejsza intencja nie była jasna)
Rozważ ten kod:
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);
}
}
}
Ten kod działa poprawnie.
Jeśli jednak zastąpię:
case VALUE1: // or VALUE2
z:
case X.VALUE1: // or X.VALUE2
wtedy kompilator skarży się:
java: /path/to/Foo.java:whatever: enum etykieta przypadku przełącznika musi być niekwalifikowaną nazwą stałej wyliczenia
WIĘCsugeruje odpowiedź z tym cytatem z JLS:
(Jednym z powodów wymagających wstawiania stałych jest to, że instrukcje przełączania wymagają stałych w każdym przypadku i żadne dwie takie stałe wartości nie mogą być takie same. Kompilator sprawdza duplikaty stałych wartości w instrukcji switch w czasie kompilacji; format pliku klasy nie jest zrobić symboliczne powiązanie wartości przypadku.)
Ale to mnie nie satysfakcjonuje. O ile mi wiadomo,VALUE1
iX.VALUE1
są dokładnie takie same. Cytowany tekst w ogóle mnie nie wyjaśnia.
Gdzie w JLS jest to zdefiniowaneenum
wartości wswitch
oświadczenia muszą być napisane w ten sposób?