2013-07-20 10 views
17

(nota: a cura questione; l'intento prima non era chiaro)Perché un valore enum non può essere pienamente qualificato in un'istruzione switch?

Considerate questo codice:

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); 
     } 
    } 
} 

Questo codice funziona bene.

Tuttavia, se sostituisco:

case VALUE1: // or VALUE2 

con:

case X.VALUE1: // or X.VALUE2 

il compilatore si lamenta:

java: /path/to/Foo.java:whatever: un'etichetta della cassetta degli interruttori enum deve essere il nome non qualificato di una costante di enumerazione

SO suggests an answer con questa citazione dal JLS:

(Una ragione per richiedere inlining di costanti è che istruzioni switch richiedono costanti in ciascun caso, e non due tali valori costanti possono essere uguali. Il compilatore verifica i valori costanti duplicati in un'istruzione switch in fase di compilazione; il formato del file di classe non esegue il collegamento simbolico dei valori dei casi.)

Ma questo non mi soddisfa. Per quanto mi riguarda, VALUE1 e X.VALUE1 sono esattamente gli stessi. Il testo citato non lo spiega affatto per me.

Dove nel JLS è definito che i valori enum nelle istruzioni switch devono essere scritti in questo modo?

+6

E 'semplicemente il modo in cui è perché è così che la specifica del linguaggio Java dice che lo è. Di cosa tratta la risposta suggerita che hai linkato che ti manca? –

+1

Semplicemente perché per quanto mi riguarda, 'VALUE1' o' X.VALUE1' sono entrambi la stessa costante; Non vedo alcuna ragione per cui non possa sostituire il secondo con il primo. – fge

+1

Ho il sospetto che sia solo la semplicità - e dopo tutto, * ogni * caso in ogni specifica istruzione switch deve essere dello stesso tipo. Perché * vuoi * la flessibilità extra (che renderebbe il JLS più complicato)? –

risposta

9

SwitchLabel si aspetta un EnumConstantName, che è definita come l'enum identificatore costante, which is unqualified:

EnumConstant:
Annotazioni opt Argomenti Identifier optano ClassBody opt

+0

Grazie MOLTO! Mi sono imbattuto in questi due punti del JLS senza riuscire a trovare il collegamento tra loro – fge

Problemi correlati