2012-04-15 16 views
157

Primero, declararé que estoy mucho más familiarizado con las enumeraciones en C# y parece que enums en java es un desastre.Java: usando la instrucción switch con enum bajo la subclase

Como puede ver, estoy tratando de usar una instrucción switch @ enums en mi próximo ejemplo pero siempre obtengo un error sin importar lo que esté haciendo.

El error que recibo es:

El caso cualificado etiqueta SomeClass.AnotherClass.MyEnum.VALUE_A debe ser reemplazado con la constante de enumeración no calificado VALUE_A

la cosa es que bastante entiendo el error pero no puede simplemente escribir el VALOR_A dado que la enumeración está ubicada en otra subclase. ¿Hay alguna manera de resolver este problema? ¿Y por qué está sucediendo en Java?

//Main Class 
public class SomeClass { 

    //Sub-Class 
    public static class AnotherClass { 
     public enum MyEnum { 
      VALUE_A, VALUE_B 
     }  
     public MyEnum myEnum; 
    } 

    public void someMethod() { 
     MyEnum enumExample //... 

     switch (enumExample) { 
      case AnotherClass.MyEnum.VALUE_A: { <-- error on this line 
       //.. 
       break; 
      } 
     } 
    } 
} 
+0

Como darrengorman comentado, Java [ 'Enum'] (http://docs.oracle.com/javase/8/ docs/api/java/lang/Enum.html) son * extremadamente * útiles una vez que les agarras el truco, nada desordenados. Son mucho más flexibles y prácticos que las enumeraciones simples (simplemente un valor entero etiquetado) como se ve en otras plataformas. Consulte el [Tutorial de Oracle] (http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html). Descubra las implementaciones optimizadas 'Set' /' Map': ['EnumSet'] (http://docs.oracle.com/javase/8/docs/api/java/util/EnumSet.html) y [' EnumMap'] (http://docs.oracle.com/javase/8/docs/api/java/util/EnumMap.html). –

+0

Cuando intenta calificar la declaración de caso; de alguna manera, estás tratando de decir que puedo mezclar diferentes tipos de enumeraciones (no solo el mismo tipo de enumeración) dentro de una sola instrucción de cambio. Java lo ha detenido con este enfoque como se discute aquí http://www.digizol.com/2010/10/enum-case-label-switch-java-qualified.html – lkamal

Respuesta

362

Cambio a esto:

switch (enumExample) { 
    case VALUE_A: { 
     //.. 
     break; 
    } 
} 

La clave está en el error. No es necesario que califique las etiquetas case con el tipo de enumeración, solo su valor.

+13

Ok me siento tan estúpido :-( Tienes toda la razón, estaba convencida de que probé esta línea exacta y recibí un error con eso, así que pasé al caso de calificación, pero tu sugerencia SI FUNCIONA. – Popokoko

+4

Por cierto, creo que estás Encontraré que las enumeraciones en Java son increíblemente útiles una vez que comiences a usarlas más, no diría que son un desastre :) – darrengorman

+0

Creo que encontraré que tienes razón en un futuro cercano :) De todos modos, esto es definitivamente el mejor foro de programación gracias a gente como tú. – Popokoko

21

Java infiere automáticamente el tipo de los elementos en case, por lo que las etiquetas deben ser sin reservas.

int i; 
switch(i) { 
    case 5: // <- integer is expected 
} 
MyEnum e; 
switch (e) { 
    case VALUE_A: // <- an element of the enumeration is expected 
} 
+8

¿Por qué no debe ser calificado? –

+8

Si puede calificar, entonces puede usar algo más que 'MyEnum' que no tendría sentido. – Kru

+0

@ Kru, pero ** puedo ** usar algo gramaticalmente-else para expresiones de casos no enum-tipadas. P.ej.'static final int MY_CONST = 7; ...; switch (intVariable) {case MY_CONST: ...;} 'en lugar de' case 7'. Así que esta restricción para las enumeraciones no tiene sentido ** no ** (puedo usar no solo los literales primarios, sino también las constantes definidas manualmente para la expresión 'switch' entera, pero no puedo usar las constantes definidas manualmente, sino solo los nombres primarios para enums). – Sasha

0

Escribir someMethod() de esta manera:

public void someMethod() { 

    SomeClass.AnotherClass.MyEnum enumExample = SomeClass.AnotherClass.MyEnum.VALUE_A; 

    switch (enumExample) { 
    case VALUE_A: 
     break; 
    } 

} 

En sentencia switch debe utilizar el nombre de constante única.

2

esto debe hacer:

//Main Class 
public class SomeClass { 

    //Sub-Class 
    public static class AnotherClass { 
     public enum MyEnum { 
      VALUE_A, VALUE_B 
     }  
     public MyEnum myEnum; 
    } 

    public void someMethod() { 
     AnotherClass.MyEnum enumExample = AnotherClass.MyEnum.VALUE_A; //... 

     switch (enumExample) { 
      case VALUE_A: { //<-- error on this line 
      //.. 
      break; 
      } 
     } 
    } 
} 
0

Así es como lo estoy usando. Y está funcionando fantásticamente -

public enum Button { 
     REPORT_ISSUES(0), 
     CANCEL_ORDER(1), 
     RETURN_ORDER(2); 

     private int value; 

     Button(int value) { 
      this.value = value; 
     } 

     public int getValue() { 
      return value; 
     } 
    } 

y la switch-case como se muestra a continuación

@Override 
public void onClick(MyOrderDetailDelgate.Button button, int position) { 
    switch (button) { 
     case REPORT_ISSUES: { 
      break; 
     } 
     case CANCEL_ORDER: { 
      break; 
     } 
     case RETURN_ORDER: { 
      break; 
     } 
    } 
} 
Cuestiones relacionadas