(uwaga: edytowane pytanie; przeor intencją nie było jasne)Dlaczego wartość wyliczenia nie może być w pełni kwalifikowana w instrukcji switch?
Rozważmy następujący 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.
Jednakże, jeśli mogę wymienić:
case VALUE1: // or VALUE2
z:
case X.VALUE1: // or X.VALUE2
następnie kompilator narzeka:
Java: /path/to/Foo.java:whatever: etykieta przypadku enum switch musi być niekwalifikowaną nazwą stałej wyliczeniowej
tak suggests an answer z tym środki z JLS:
(Jednym z powodów konieczności inline stałych jest to, że wymagają stwierdzenia przełącznik stałe w każdym przypadku, a nie dwie stałe wartości te mogą być takie same. Kompilator sprawdza duplikaty wartości stałych w instrukcji switch podczas kompilacji; format pliku klas nie tworzy symbolicznego powiązania wartości wielkości liter).
Ale to mnie nie satysfakcjonuje. O ile mi wiadomo, VALUE1
i X.VALUE1
są dokładnie takie same. Cytowany tekst wcale mi tego nie wyjaśnia.
Gdzie w JLS zdefiniowano, że wartości enum
w instrukcjach switch
muszą być zapisane w ten sposób?
To po prostu tak jest, ponieważ tak mówi specyfikacja języka Java. Co jest takiego w sugerowanej odpowiedzi, którą łączyłeś, której brakuje? –
Po prostu dlatego, że o ile mi wiadomo, "VALUE1" lub "X.VALUE1" mają tę samą stałą; Nie widzę powodu, dla którego nie mógłbym zastąpić tego pierwszego. – fge
Podejrzewam, że to po prostu prostota - i ostatecznie, * co * przypadek w konkretnej instrukcji switcha musi być tego samego typu. Dlaczego * chcesz * dodatkowej elastyczności (która sprawiłaby, że JLS byłby bardziej skomplikowany)? –