2012-05-11 8 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; 
    } 
    } 
} 

El código anterior compila bien y da el resultado esperado.referencia enum en la caja del interruptor

Mi pregunta es por qué al crear la referencia de color 'c' necesitábamos referirnos con el nombre de la enumeración (es decir, Color.GREEN) pero en el bloque de casos solo bastaba el valor enum. ¿No debería haber sido

case Color.RED: 

etc ???

Respuesta

5

No, no debería. El compilador de Java es lo suficientemente inteligente como para saber que está activando un Color y, por lo tanto, el lenguaje permite este acceso directo (y, como señala Paul, lo requiere). De hecho, la compilación completa de una instrucción switch depende de que el compilador sepa qué está encendiendo, ya que traduce el cambio en una tabla de salto basada en el índice del valor enum que usted especifique. Solo recientemente ha podido activar elementos no numéricos como String.

La parte pertinente de la especificación de lenguaje es en JLS Chapter 14.11:

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

EnumConstantName: 
    Identifier 

Si está buscando información sobre por qué el lenguaje se diseñó la forma en que fue, eso va a ser difícil de responder objetivamente El diseño del lenguaje se matiza, y debe tener en cuenta que la sintaxis de la tarea se escribió años y años antes de que se agregara el soporte enum.

+1

+1 De hecho, * tiene * para usar el acceso directo. Ver [esta interesante publicación] (http://stackoverflow.com/q/8481635/697449) por ejemplo. –

+0

@Paul: una etiqueta de caja de cambio enum ** DEBE ** ser el nombre _unqualified_ de una constante de enumeración. Entonces ... lo tengo ... – WickeD

2

Es una convención de idiomas. Muchos idiomas diferentes tienen enumeraciones, y no todos te hacen hacer esto. En el caso de Java, puede hacer Color.RED o lo que sea, debido a espacios de nombres. Al hacerlo, puede tener varias enumeraciones con los mismos nombres de variable, y no entran en conflicto.

El motivo por el que la instrucción switch no requiere que haga Color.RED (y le permite simplemente indicar RED) es que la instrucción switch sabe que es una enumeración de tipo Color y busca en ese espacio de nombres.

1

En la línea

Color c = Color.GREEN; 

la Color. es necesario porque el compilador Java no infiere el tipo de la expresión asignada (Color.GREEN) a partir de la declaración (Color c). Por la misma razón, usted tiene que escribir:

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

y no simplemente

ArrayList<String> x = new ArrayList(); 

(Esto es en realidad la parte fija en Java 7, pero eso es otra historia.) En la declaración switch(...), el tipo de el case se infiere del tipo de switch sin embargo.

Cuestiones relacionadas