Проблема с коммутатором Java: выражения case должны быть постоянными выражениями

У меня проблема в моей инструкции switch / case. Ошибка говорит: «Выражения случая должны быть постоянными выражениями». Я понимаю ошибку, и я могу ее разрешить, используя If, но может кто-то подскажет мне, почему выражение case должно быть постоянным в switch / case. Пример кода моей ошибки:

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 для вашего объяснения !!

Поэтому его можно оценить на этапе компиляции (статически проверить)

См. http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.11 для формального определения switch .

Кроме того, это может помочь вам лучше понять, как этот switch преобразуется в байт-код:

 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; } } } 

И после компиляции:

 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 } 

Посмотрите, что строка помечена как 1:

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

Он оценивает значение и переходит к другой строке. Например, если значение равно 9 оно переходит к инструкции 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 

Который, в свою очередь, переходит к инструкции 58:

  58: return 

Все это было бы невозможно, если бы оно оценивалось динамически. Вот почему.

В eclipse IDE прост, в предложение CTRL + 1 и предложение switch switch – предложение if-else http://tools.android.com/tips/non-constant-fields

idDirectory и другие должны быть константой, а не объявленной переменной. В этом случае Switch не работает, вам нужно переключиться на конструкцию if-else .

EDIT Я вижу, что означает OP. Именно так работает коммутатор на языке Java.

Intereting Posts
Каковы преимущества и недостатки запуска службы в разных процессах? Запустите только одно настраиваемое приложение на Android, чтобы не запускать что-либо еще Android Studio, Git и три способа слияния Google Maps Android MapView v2: отключить масштабирование Публикация необработанных данных изображения вместо URL-адреса с помощью Android Facebook SDK Android – Как программно установить цвет кнопки Получайте одновременно несколько данных датчиков в Android Как найти элемент внутри gridview в Android? Xml to json в android Eclipse для преобразования XML-атрибутов в элементы стиля Как публиковать сообщение на стене Twitter, используя twitter, интегрировать приложение для Android Как отправить файл с android на wifi-принтер программно и распечатать файл? Android, эквивалентный индексированному iphone UITableView Hook LayoutInflater и изменить значения при раздувании просмотров Как выполнить операцию отмены повтора в EditText