2011-06-17 22 views
104

duplicados posibles:
Compilation error - switch with enum
Why do I get an Enum constant reference cannot be qualified in a case label?Encienda Enum en Java

¿Por qué no se puede cambiar en una enumeración en Java? Parece lo suficientemente simple de hacer y sería un código conveniente. También esta pregunta podría aplicarse al String. Puede encender un char, pero no un String ...?

+11

Muéstrenos su código de conmutador de enum que no funciona. –

+1

Por qué se duplican los indicadores, observe qué tan preciso es el encabezado, fácil de encontrar para los nuevos usuarios. – Indigo

+0

Puede echar un vistazo a este artículo para ver cómo se hace: http://www.tutorialspoint.com/javaexamples/method_enum.htm –

Respuesta

209

Definitivamente puede activar enumeraciones. Un ejemplo publicado desde el Java tutorials.

public enum Day { 
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, 
    THURSDAY, FRIDAY, SATURDAY 
} 

public class EnumTest { 
    Day day; 

    public EnumTest(Day day) { 
     this.day = day; 
    } 

    public void tellItLikeItIs() { 

     switch (day) { 
      case MONDAY: 
       System.out.println("Mondays are bad."); 
       break; 

      case FRIDAY: 
       System.out.println("Fridays are better."); 
       break; 

      case SATURDAY: 
      case SUNDAY: 
       System.out.println("Weekends are best."); 
       break; 

      default: 
       System.out.println("Midweek days are so-so."); 
       break; 
     } 
    } 
} 
+2

Hermoso ejemplo que responde muy bien a la pregunta. Dicho esto, he estado programando Java durante 14 años y no recuerdo un solo caso en el que mantuve una declaración de cambio en el código de producción. Cuando una instrucción switch sea mejor que una serie de if/else, siempre he escrito un método de instancia en mi enumeración en lugar de lo que sugiere Josh Bloch. En mi enumeración 'Day', agrego' public string tellItLikeItis() {return "Entre semana los días son regulares."; } 'luego tienen' LUNES ',' VIERNES', 'SÁBADOS', y' DOMINGO' anulan ese método. – GlenPeterson

+0

Lo que quiere decir que lo hago como @GregMattes sugiere en la segunda respuesta más popular. – GlenPeterson

+2

@GlenPeterson FYI si intenta optimizar la velocidad, el enfoque de declaración de cambio puede ser más rápido porque es solo una búsqueda de tabla en el bytecode. Con su enfoque, debe insertar una nueva función en la pila. Es una micro-optimización, pero si la velocidad es muy importante, es algo a tener en cuenta. – DIMMSum

22
  • Encienda enumeraciones funciona bien.

    enum MyEnum { CONST_ONE, CONST_TWO } 
    
    class Test { 
        public static void main(String[] args) { 
         MyEnum e = MyEnum.CONST_ONE; 
    
         switch (e) { 
          case CONST_ONE: System.out.println(1); break; 
          case CONST_TWO: System.out.println(2); break; 
         } 
        } 
    } 
    

    ideone.com demo

  • Interruptores para cuerdas son implementados en Java 7.

    Lea sobre todas las nuevas características here.

26

Primero, puede encender un enum en Java. Supongo que intentabas decir que no puedes, pero puedes. char s tienen un rango de valores establecido, por lo que es fácil de comparar. Las cadenas pueden ser cualquier cosa.

Una declaración switch generalmente se implementa como jump table (branch table) en la compilación subyacente, que solo es posible con un conjunto finito de valores. C# puede activar cadenas, pero provoca una disminución del rendimiento porque no se puede utilizar una tabla de salto.

Java 7 y versiones posteriores admite String switches con las mismas características.

+7

+1 para explicación arquitectónica. –

+0

Un poco de un ejemplo de código hubiera sido útil ... –

10

Puede que esté utilizando las enumeraciones incorrectamente en las cajas de interruptores. En comparación con el ejemplo anterior por CoolBeans .. que podría estar haciendo lo siguiente:

switch(day) { 
    case Day.MONDAY: 
     // Something.. 
     break; 
    case Day.FRIDAY: 
     // Something friday 
     break; 
} 

Asegúrese de que utiliza los valores de enumeración reales en vez de EnumType.EnumValue

Eclipse señala este error, aunque ..

+0

+1 Sin embargo, encontré que cuando asigna, debe usar day = Day.Monday; De lo contrario, estaba obteniendo un error de compilación 'no puedo encontrar el símbolo'. – likejiujitsu

1

Actualmente, puede usar una sentencia switch con Strings en Java ... desafortunadamente esta es una nueva característica de Java 7, y la mayoría de la gente aún no usa Java 7 porque es muy nueva.

64

en realidad se puede switch en enum s, pero no se puede switch en String s hasta Java 7. Se podría considerar el uso de método polimórfico despacho con Java enum s en lugar de una explícita switch. Tenga en cuenta que enum s son objetos en Java, no solo símbolos para int como si estuvieran en C/C++.Puede tener un método en un tipo enum, luego, en lugar de escribir un switch, simplemente llame al método - una línea de código: ¡listo!

enum MyEnum { 
    SOME_ENUM_CONSTANT { 
     @Override 
     public void method() { 
      System.out.println("first enum constant behavior!"); 
     } 
    }, 
    ANOTHER_ENUM_CONSTANT { 
     @Override 
     public void method() { 
      System.out.println("second enum constant behavior!"); 
     } 
    }; // note the semi-colon after the final constant, not just a comma! 
    public abstract void method(); // could also be in an interface that MyEnum implements 
} 

void aMethodSomewhere(final MyEnum e) { 
    doSomeStuff(); 
    e.method(); // here is where the switch would be, now it's one line of code! 
    doSomeOtherStuff(); 
} 
+16

+1: nunca lo he visto usado de esta manera. Interesante. – CoolBeans

+3

Una de las cosas buenas de este enfoque es que simplemente es imposible obtener ciertos tipos de errores. No se puede perder una caja de interruptor (puede implementar incorrectamente un método para una constante particular, ¡pero no hay nada que evite totalmente que eso ocurra!). No hay ningún interruptor "predeterminado" de qué preocuparse. Además, he visto código que pone constantes enum en matrices y luego índices en las matrices, esto abre la posibilidad de excepciones de índice fuera de límites de matrices, ¡simplemente use la enumeración! Las enumeraciones de Java son muy, muy poderosas. Aprenda todo lo que pueda sobre ellos para usarlos de manera efectiva. –

+2

También tenga en cuenta si tiene varias constantes de enum que tienen el mismo comportamiento para un método en particular (como @CoolBeans días de la semana ejemplo en el cual los fines de semana tienen el mismo comportamiento y los días de la semana de martes a jueves también comparten el mismo comportamiento), simplemente puede recopilar ese código compartido en un método enum que no se anula por cada constante (protección final) y luego llamar a ese método desde los métodos apropiados. Entonces, en mi ejemplo, podría agregar "final protected void commonMethod() {...}" y luego la implementación de method() en cada constante simplemente llamaría a commonMethod(). –