1. Оператор множественного выбора — switch

Оператор множественного выбора – switch

В Java есть еще один интересный оператор, доставшийся в наследство от бабушки (языка C++). Это оператор switch. Его еще называют оператором множественного выбора. Выглядит он немного громоздко:

switch(выражение)
{
   case значение1: код1;
   case значение2: код2;
   case значение3: код3;
}

Внутри скобок указывается какое-нибудь выражение или переменная. Если значение выражений равно значение1, начинает выполняться код1, если равно значение2, начинает выполняться код2, если равно значение3 начинает выполняться код3.

Пример:

Код Вывод на экран
int temperature = 38;

switch(temperature)
{
   case 36: System.out.println("Низкая");
   case 37: System.out.println("Нормальная");
   case 38: System.out.println("Высокая");
}
Высокая

2. Оператор break в switch

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

Пример:

Код Вывод на экран
int temperature = 36;

switch(temperature)
{
   case 36: System.out.println("Низкая");
   case 37: System.out.println("Нормальная");
   case 38: System.out.println("Высокая");
}
Низкая
Нормальная
Высокая

При значении температуры 36, программа перейдет внутри switch на первый блок кода — первую строку, и после ее выполнения просто будут выполняться остальные блоки кода.

Если вы хотите, чтобы в каждом случае выполнялся только один блок кода, на который перепрыгнуло выполнение программы, вам после этого блока кода нужно написать оператор break;

Пример:

Код Вывод на экран
int temperature = 36;

switch(temperature)
{
   case 36:
      System.out.println("Низкая");
      break;
   case 37:
      System.out.println("Нормальная");
      break;
   case 38:
      System.out.println("Высокая");
}
Низкая

У последнего варианта в switch можно break не писать, все равно блок кода там последний.


3. Действие по умолчанию: default

Еще важный момент. А что будет происходить, если ни одно из предложенных значений внутри switch не совпало со значением выражения внутри круглых скобок?

Если подходящий вариант не найдется, работа оператора switch завершится, и программа продолжит выполнять тот код, который написан после фигурных скобок оператора switch.

Однако в switch есть возможность сделать поведение, аналогичное ветке else из if-else. Для этого нужно использовать ключевое слово default.

Если ни один case вариант внутри switch не совпал со значением выражения и в switch объявлен default, будет выполнен его код. Пример:

Код Вывод на экран
int temperature = 40;
switch(temperature)
{
   case 36:
      System.out.println("Низкая");
      break;
   case 37:
      System.out.println("Нормальная");
      break;
   case 38:
      System.out.println("Высокая");
      break;
   default:
      System.out.println("Нужна скорая");
}
Нужна скорая

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

Оператор switch чем-то похож на оператор if-else, только он его более сложный вариант.

Вы всегда можете переписать код switch в виде нескольких if-ов. Пример:

Код со switch Код с if-else
int temperature = 40;
switch(temperature)
{
   case 36:
      System.out.println("Низкая");
      break;
   case 37:
      System.out.println("Нормальная");
      break;
   case 38:
      System.out.println("Высокая");
      break;
   default:
      System.out.println("Нужна скорая");
}
int temperature = 40;

if (temperature == 36)
{
   System.out.println("Низкая");
}
else if (temperature == 37)
{
   System.out.println("Нормальная");
}
else if (temperature == 38)
{
   System.out.println("Высокая");
}
else
{
   System.out.println("Нужна скорая");
}

Код слева будет работать точно так же, как и код справа.

Цепочку в виде нескольких if-else лучше использовать, когда внутри условия if различные сложные выражения в каждом отдельном случае.


14
Задача
Java Syntax Pro,  14 уровень7 лекция
Недоступна
Из if в switch
В классе Solution есть метод getMonthByIndex(int), который возвращает название месяца по его номеру, начиная с 1. Твоя задача — переписать метод, используя только оператор switch и ключевые слова case, break.
14
Задача
Java Syntax Pro,  14 уровень7 лекция
Недоступна
Из switch в if
В классе Solution есть метод getTranslationForDayOfWeek(String), который возвращает перевод дня недели с английского на русский. Твоя задача — переписать метод, используя только оператор if-else.

5. Что можно использовать в качестве параметра у switch?

Не все типы можно использовать в качестве значений для case внутри оператора switch. Сейчас там можно использовать литералы таких типов:

  • целые типы: byte, short, int
  • тип char
  • тип String
  • значения любого enum-типа

Никаких других типов писать в качестве значений внутри case нельзя.

Пример использования enum внутри switch:

Day day = Day.MONDAY;
switch (day)
{
   case MONDAY:
      System.out.println("Понедельник");
      break;
   case TUESDAY:
      System.out.println("Вторник");
      break;
   case WEDNESDAY:
      System.out.println("Среда");
      break;
   case THURSDAY:
      System.out.println("Четверг");
      break;
   case FRIDAY:
      System.out.println("Пятница");
      break;
   case SATURDAY:
      System.out.println("Суббота");
      break;
   case SUNDAY:
      System.out.println("Воскресенье");
      break;
}

Примечание. Если вы используете enum внутри switch, можно не писать имя класса перед каждым значением в case. Достаточно просто написать значение.


14
Задача
Java Syntax Pro,  14 уровень7 лекция
Недоступна
Типы многоугольников
В классе Solution есть метод getShapeNameByCountOfCorners(int), который возвращает название многоугольника в зависимости от количества углов. Твоя задача — переписать метод, используя только оператор switch.