Un problema Java de conmutación: las expresiones de caso deben ser expresiones constantes

Tengo un problema en mi declaración de switch / case. El error dice: "Las expresiones de caso deben ser expresiones constantes". Entiendo el error y puedo resolverlo usando If pero alguien puede decirme porqué la expresión del caso debe ser constante en un interruptor / caso. Un ejemplo de código de mi error:

public boolean onOptionsItemSelected(MenuItem item) { int idDirectory = ((MenuItem) findViewById(R.id.createDirectory)).getItemId(); int idSuppression = ((MenuItem) findViewById(R.id.recycleTrash)).getItemId(); int idSeeTrash = ((MenuItem) findViewById(R.id.seeTrash)).getItemId(); switch (item.getItemId()) { case idDirectory: createDirectory(currentDirectory); break; case idSuppression: recycleTrash(); break; case idSeeTrash: seeTrash(); break; } return super.onOptionsItemSelected(item); } 

Thx para su explicación!

Por lo tanto, se puede evaluar durante la fase de compilación (verificación estática)

Vea: http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.11 para una definición formal del switch .

Además, puede ayudarle a comprender mejor cómo se transforma este switch en bytecode:

 class Switch { void x(int n ) { switch( n ) { case 1: System.out.println("one"); break; case 9: System.out.println("nine"); break; default: System.out.println("nothing"); break; } } } 

Y después de compilar:

 C:\>javap -c Switch Compiled from "Switch.java" class Switch extends java.lang.Object{ Switch(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return void x(int); Code: 0: iload_1 1: lookupswitch{ //2 1: 28; 9: 39; default: 50 } 28: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 31: ldc #3; //String one 33: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 36: goto 58 39: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 42: ldc #5; //String nine 44: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 47: goto 58 50: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 53: ldc #6; //String nothing 55: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 58: return } 

Vea esa línea marcada como 1:

  1: lookupswitch{ //2 1: 28; 9: 39; default: 50 } 

Evalúa el valor y va a alguna otra línea. Por ejemplo, si el valor es 9 , saltará a la instrucción 39:

  39: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 42: ldc #5; //String nine 44: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 47: goto 58 

Que a su vez salta a la instrucción 58:

  58: return 

Todo esto no sería posible si se evaluara dinámicamente. Es por eso.

En eclipse IDE es simple, en cambiar la oración CTRL + 1 y convertir la sentencia switch – if-else frase http://tools.android.com/tips/non-constant-fields

El idDirectory y otros necesitan ser una constante y no una variable declarada. Switch no funcionará en este caso, necesita cambiar a if-else construct.

EDITO Veo lo que significaba OP. Así es como funciona el conmutador en lenguaje java.

  • Botones onClick del interruptor
  • ¿Reutilizar las actividades anteriores?
  • Cambiar instrucción con cadena como argumento en Android
  • El texto de Android debe aparecer en ambos lados en el
  • Cambiar las actividades de un lado a otro en Android
  • ¿Por qué utilizar un hashmap?
  • Interruptor multinivel Android
  • Android Cambiar entre actividades
  • Cambiar del diseño main.xml a otro diseño
  • Cómo cambiar la altura y el ancho de Switch en Android
  • ¿O declaración en el interruptor / caso?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.