Использовать строку в корпусе переключателя в java

Мне нужно изменить следующее, if это нужно для проверки String , чтобы улучшить циклическую сложность.

 String value = some methodx; if ("apple".equals(value)) { method1; } if ("carrot".equals(value)) { method2; } if ("mango".equals(value)) { method3; } if ("orange".equals(value)) { method4; } 

Но я не уверен, какую ценность я получу.

Java (до версии 7) не поддерживает String в switch / case. Но вы можете достичь желаемого результата, используя перечисление.

 private enum Fruit { apple, carrot, mango, orange; } String value; // assume input Fruit fruit = Fruit.valueOf(value); // surround with try/catch switch(fruit) { case apple: method1; break; case carrot: method2; break; // etc... } 

Научитесь использовать else .

Поскольку value никогда не будет равно двум неравным строкам сразу, есть только 5 возможных результатов: по одному для каждого значения, которое вам нужно, плюс один для «ни одного из вышеперечисленных». Но поскольку ваш код не устраняет те тесты, которые не могут пройти, он имеет 16 «возможных» путей (2 ^ число тестов), из которых большинство никогда не будет соблюдаться.

В else случае единственными путями, которые существуют, являются 5, которые действительно могут произойти.

 String value = some methodx; if ("apple".equals(value )) { method1; } else if ("carrot".equals(value )) { method2; } else if ("mango".equals(value )) { method3; } else if ("orance".equals(value )) { method4; } 

Или начните использовать JDK 7, который включает в себя возможность использования строк в инструкции switch . Конечно, Java будет просто компилировать этот switch в конструкцию if / else так или иначе …

Сегодня все используют Java 7 , верно? Вот ответ на исходную проблему:

 String myString = getFruitString(); switch (myString) { case "apple": method1(); break; case "carrot": method2(); break; case "mango": method3(); break; case "orange": method4(); break; } 

Заметки

  • Операторы case эквивалентны использованию String.equals .
  • Как обычно, соответствие строк зависит от регистра.
  • Согласно документам , это, как правило, быстрее, чем использование прикованных операторов if else (как в ответе cHao ).

Чтобы уменьшить циклическую сложность, используйте карту:

 Map> map = new HashMap < > ( ) ; map . put ( "apple" , new Callable () { public Object call ( method1 ( ) ; return null ; } ) ; ... map . get ( x ) . call ( ) ; 

или polymorphism

Чтобы ответить на конкретный вопрос, исполняемый код выглядит следующим образом:

  Map> map = new HashMap>(); map.put( "test" , new Callable () { public User call (){ return fillUser("test" ); }} ) ; map.put( "admin" , new Callable () { public Utente call (){ return fillUser("admin" ); }} ) ; 

где пользователь является POJO, а затем

  User user = map.get(USERNAME).call(); 

наконец, вызываемый метод находится где-то:

  private User fillUser(String x){ User user = new User(); // set something in User return user; } 

Java не поддерживает Switch-case со String. Думаю, эта ссылка может вам помочь. 🙂

Вот возможный способ до 1.7, который я не могу рекомендовать:

 public class PoorSwitch { final static public int poorHash (String s) { long l = 0L; for (char c: s.toCharArray ()) { l = 97*l + c; } return (int) l; } public static void main (String args[]) { String param = "foo"; if (args.length == 1) { param = args[0]; } // uncomment these lines, to evaluate your hash // test ("foo"); // test ("bar"); switch (poorHash (param)) { // this doesn't work, since you need a literal constant // so we have to evaluate our hash beforehand: // case poorHash ("foo"): { case 970596: { System.out.println ("Foo!"); break; } // case poorHash ("bar"): { case 931605: { System.out.println ("Bar!"); break; } default: { System.out.println ("unknown\t" + param); break; } } } public static void test (String s) { System.out.println ("Hash:\t " + s + " =\t" + poorHash (s)); } } 

Возможно, вы могли бы работать с таким трюком в сгенерированном коде. Иначе я не могу это порекомендовать. Не так много, что возможность столкновения hashей заставляет меня беспокоиться, но если что-то перепутано (вырезать и вставить), трудно найти ошибку. 931605 не является хорошей документацией.

Возьмите его как доказательство концепции, как любопытство.

Мы можем применять Switch только по типу данных, совместимым с int: short, Shor, byte, Byte, int, Integer, char, Character или enum type.

Оценка переменных String с помощью оператора switch реализована в Java SE 7 , и, следовательно, она работает только в java 7. Вы также можете посмотреть, как эта новая функция реализована в JDK 7.

Java 8 поддерживает строковый коммутатор.

 String type = "apple"; switch(type){ case "apple": //statements break; default: //statements break; } 
  String name,lname; name= JOptionPane.showInputDialog(null,"Enter your name"); lname= JOptionPane.showInputDialog(null,"Enter your father name"); if(name.equals("Ahmad")){ JOptionPane.showMessageDialog(null,"welcome "+name); } if(lname.equals("Khan")) JOptionPane.showMessageDialog(null,"Name : "+name +"\nLast name :"+lname ); else { JOptionPane.showMessageDialog(null,"try again " ); } }} 

Не очень красиво, но вот еще один способ:

 String runFct = queryType.equals("eq") ? "method1": queryType.equals("L_L")? "method2": queryType.equals("L_R")? "method3": queryType.equals("L_LR")? "method4": "method5"; Method m = this.getClass().getMethod(runFct); m.invoke(this); 
 String value = someMethod(); switch(0) { default: if ("apple".equals(value)) { method1(); break; } if ("carrot".equals(value)) { method2(); break; } if ("mango".equals(value)) { method3(); break; } if ("orance".equals(value)) { method4(); break; } } 
  • Java: если vs. Switch
  • Преимущество перехода на оператор if-else
  • Использование случая для ряда чисел в Bash
  • В Java, используя оператор switch с диапазоном значений в каждом случае?
  • Как скомпилировать коммутатор в Visual C ++ и насколько он оптимизирован и быстро?
  • В чем разница между IF-ELSE и SWITCH?
  • Использование двух значений для одного оператора case switch
  • Почему переменные не могут быть объявлены в инструкции switch?
  • Почему ваш тип данных оператора switch не может быть длинным, Java?
  • идея выбора переключателя / образца
  • Лучший способ включить строку в C
  • Давайте будем гением компьютера.