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