1. Операторът с множествен избор:switch

Java има друг интересен оператор, който е наследил от своя дядо (C++). Говорим за switchизявлението. Можем да го наречем и оператор с множествен избор. Изглежда малко тромаво:

switch(expression)
{
   case value1: code1;
   case value2: code2;
   case value3: code3;
}

Израз or променлива е посочен в скобите. Ако стойността на израза е value1, Java машината започва да изпълнява code1. Ако изразът е equals на value2, изпълнението преминава към code2. Ако изразът е equals на value3, тогава code3се изпълнява.

Пример:

Код Конзолен изход
int temperature = 38;

switch(temperature)
{
   case 36: System.out.println("Low");
   case 37: System.out.println("Normal");
   case 38: System.out.println("High");
}
High

2. breakизявление вswitch

Важна характеристика на switchоператора е, че програмата просто прескача до необходимия ред (до необходимия codeов блок) и след това изпълнява всички блокове code до края на switch. Не само блокът от code, съответстващ на стойността в switch, но всички блокове от code до края на switch.

Пример:

Код Конзолен изход
int temperature = 36;

switch(temperature)
{
   case 36: System.out.println("Low");
   case 37: System.out.println("Normal");
   case 38: System.out.println("High");
}
Low
Normal
High

При дадена температура от 36, програмата ще въведе switchоператора, ще премине към и ще изпълни първия блок code (първия случай) и след това весело ще изпълни останалите блокове code.

Ако искате да изпълните само един блок от code - блокът от code, свързан със съвпадащия регистър - тогава трябва да завършите блока с breakизраз;

Пример:

Код Конзолен изход
int temperature = 36;

switch(temperature)
{
   case 36:
      System.out.println("Low");
      break;
   case 37:
      System.out.println("Normal");
      break;
   case 38:
      System.out.println("High");
}
Low

Можете да пропуснете breakпоследния случай на switchоператора, тъй като този блок е последният със or без оператор за прекъсване.


3. Действие по подразбиране:default

Друг важен момент. Какво се случва, ако нито един от изброените случаи не съвпада switchс израза в скобите?

Ако не бъде намерен съвпадащ регистър, тогава останалата част от switchоператора се пропуска и програмата ще продължи изпълнението след фигурната скоба, завършваща оператора switch.

Въпреки това можете също така да накарате switchизявление да се държи като клона else в if-elseизявление. За да направите това, използвайте defaultключовата дума.

Ако нито един от cases в switchблока не съответства на стойността на израза и switchима defaultблок, ще бъде изпълнен блокът по подразбиране. Пример:

Код Конзолен изход
int temperature = 40;
switch(temperature)
{
   case 36:
      System.out.println("Low");
      break;
   case 37:
      System.out.println("Normal");
      break;
   case 38:
      System.out.println("High");
      break;
   default:
      System.out.println("Call an ambulance");
}
Call an ambulance

4. Сравняване switchиif-else

Изявлението switchе донякъде подобно на if-elseизявление, само че е по-сложно.

Винаги можете да пренапишете codeа на дадено switchизявление като множество ifизявления. Пример:

Код с превключвател Кодирайте с if-else
int temperature = 40;
switch(temperature)
{
   case 36:
      System.out.println("Low");
      break;
   case 37:
      System.out.println("Normal");
      break;
   case 38:
      System.out.println("High");
      break;
   default:
      System.out.println("Call an ambulance");
}
int temperature = 40;

if (temperature == 36)
{
   System.out.println("Low");
}
else if (temperature == 37)
{
   System.out.println("Normal");
}
else if (temperature == 38)
{
   System.out.println("High");
}
else
{
   System.out.println("Call an ambulance");
}

Кодът отляво ще работи точно Howто codeът отдясно.

Веригата от множество if-elseизрази е за предпочитане, когато даден ifоператор съдържа различни сложни изрази във всеки отделен случай.



5. Какви изрази могат да се използват в switchизявление?

Не всички типове могат да се използват като caseетикети в switchизявление. Можете да използвате литерали от следните типове:

  • цели числа: byte, short, int,long
  • char
  • String
  • всяHowъв enumтип

Не можете да използвате други типове като етикети на случай.

Пример за използване на enumвътрешно switchизявление:

Day day = Day.MONDAY;
switch (day)
{
   case MONDAY:
      System.out.println("Monday");
      break;
   case TUESDAY:
      System.out.println("Tuesday");
      break;
   case WEDNESDAY:
      System.out.println("Wednesday");
      break;
   case THURSDAY:
      System.out.println("Thursday");
      break;
   case FRIDAY:
      System.out.println("Friday");
      break;
   case SATURDAY:
      System.out.println("Saturday");
      break;
   case SUNDAY:
      System.out.println("Sunday");
      break;
}

Забележка: Ако използвате enumвътрешен switchоператор, не е необходимо да пишете името на класа пред всяка стойност в етикетите case. Достатъчно е просто да напишете стойността.