2013-07-20 3 views
17

(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?

+6

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? –

+1

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

+1

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)? –

Odpowiedz

9

SwitchLabel oczekuje EnumConstantName, który jest zdefiniowany jako enum stałym identyfikatorem, which is unqualified:

EnumConstant:
Adnotacje opt Identyfikator Argumenty zdecydować ClassBody opt

+0

Wielkie dzięki! Natknąłem się na te dwa punkty JLS, nie mogąc znaleźć związku między nimi – fge