2012-05-11 10 views
7
enum Color {RED, GREEN, BLUE}; 
class SwitchEnum 
{ 
    public static void main(String[] args) 
    { 
    Color c = Color.GREEN; 
    switch(c) 
    { 
     case RED: 
     System.out.println("red"); 
     break; 
     case GREEN: 
     System.out.println("green"); 
     break; 
     case BLUE: 
     System.out.println("blue"); 
     break; 
    } 
    } 
} 

Il codice precedente compila bene e fornisce l'output previsto.riferimento enumerazione in caso di interruzione

La mia domanda è il motivo per cui durante la creazione del riferimento colore "c", era necessario fare riferimento al nome dell'enum (ad esempio Color.GREEN), ma nel blocco del caso era sufficiente solo il valore enum. Non dovrebbe essere stato

case Color.RED: 

ecc ???

risposta

5

No, non dovrebbe. Il compilatore Java è abbastanza intelligente da sapere che si sta attivando un Color e quindi la lingua consente questo collegamento (e come richiesto da Paul, lo richiede). Di fatto, l'intera compilazione di un'istruzione switch dipende dal fatto che il compilatore sappia cosa stai accendendo, poiché traduce l'interruttore in una tabella di salto in base all'indice del valore enum specificato. Solo di recente sei stato in grado di attivare elementi non numerici come un String.

La parte rilevante della specifica lingua è in JLS Chapter 14.11:

... 
SwitchLabel: 
    case ConstantExpression : 
    case EnumConstantName : 
    default : 

EnumConstantName: 
    Identifier 

Se siete alla ricerca di informazioni sul perché la lingua è stato progettato il modo in cui era, che sta per essere difficile da rispondere obiettivamente. Il design della lingua è sfumato e devi considerare che la sintassi dell'assegnazione è stata scritta anni e anni prima che il supporto enum fosse aggiunto.

+1

+1 Infatti * è * necessario utilizzare la scorciatoia. Vedi [questo interessante post] (http://stackoverflow.com/q/8481635/697449) per esempio. –

+0

@Paul: un'etichetta della cassetta degli interruttori enum ** DEVE ** essere il nome _qualificato_di una costante enum. thnx ... capito ... – WickeD

2

È una convenzione linguistica. Molte lingue diverse hanno enumerazioni, e non tutte ti fanno fare questo. Nel caso di Java, puoi eseguire Color.RED o qualsiasi altra cosa, a causa degli spazi dei nomi. Facendo così, puoi avere enumerazioni multiple con gli stessi nomi di variabili e non si scontrano.

Il motivo per cui l'istruzione switch non richiede di eseguire Color.RED (e consente semplicemente di indicare RED) è che l'istruzione switch sa che si tratta di una enumerazione di tipo Color e cerca in tale spazio dei nomi.

1

Nella linea

Color c = Color.GREEN; 

il Color. è necessaria perché il compilatore Java non dedurre il tipo dell'espressione assegnato (Color.GREEN) dalla dichiarazione (Color c). Per lo stesso motivo, si deve scrivere:

ArrayList<String> x = new ArrayList<String>(); 

e non semplicemente

ArrayList<String> x = new ArrayList(); 

(Questo è in realtà parzialmente risolto in Java 7, ma questa è un'altra storia.) Nella dichiarazione switch(...), il tipo di il case viene tuttavia dedotto dal tipo di switch.

Problemi correlati