2009-06-08 16 views
9

Ho un'istruzione switch in Java, su un Enum che chiamiamo IMyInterface.MyEnumNelle istruzioni switch Java sull'enumerazione, perché ricevo un errore di compilazione quando qualifico i miei valori in ciascun caso?

Ognuno dei miei casi di dichiarazioni ha la forma: IMyInterface.MyEnum.MyValue, (anche se ho potuto cadere l'IMyInterface se ho importato).

Tuttavia, il compilatore (Java 6) genera un errore: "L'etichetta del caso qualificato IMyInterface.MyEnum.MyValue deve essere sostituita con la costante enum nonqqificata MyValue".

Posso ovviamente farlo, ma per la vita di me non capisco quale sia lo scopo di questo errore. Chiaramente, se il compilatore può gestire il valore reale, dovrebbe essere in grado di gestire il nome completo come per le costanti. In effetti, avrei assunto che il compilatore trasformasse la costante nel nome completo.

Quindi, guru Java, qual è la logica alla base di questo? Grazie!

+1

Personalmente, non mi dispiace che le enumerazioni non possano essere qualificate in blocchi di switch-case; rende il codice più leggibile. Tieni presente che per le classi di enumerazione che possiedi (nel codice che puoi modificare), la migliore pratica è quella di non utilizzare mai un blocco di switch case. In questa situazione, i metodi specifici costante Enum sono più manutenibili e meno fragili rispetto al caso switch-case. – scottb

risposta

18

Dal JLS:

(One reason for requiring inlining of constants is that switch statements require constants on each case, and no two such constant values may be the same. The compiler checks for duplicate constant values in a switch statement at compile time; the class file format does not do symbolic linkage of case values.)

Lo si può trovare here.

+1

Come hai mai trovato quel pezzo? +1 per trovare un ago in un pagliaio. –

+0

lol Ho ricordato di aver letto qualcosa su questo una volta ... Per fortuna ho il PDF JLS sul mio desktop solo per questo tipo di occasioni;) – laginimaineb

+0

L'ho preferito (quindi tutto quello che devo fare è aprire una nuova scheda e digitare JLS) , ma non riesco ancora a trovare nulla di rilevante. Immagino che non abbia pensato alla compatibilità binaria come una possibile ragione. –

3

Questo è uno strano. Ho dovuto scavare un po 'per scoprire questo. Sembra che sia più sicuro digitare il controllo sull'oggetto che si sta accendendo rispetto al nome completo completo.

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6191812 è stato segnalato un bug per consentire di specificare enumerate qualificate ma è stato chiuso e non è stato attivato per i motivi che è possibile vedere nel contenitore.

Problemi correlati