switch, case, default - 1

— Привет, Амиго!

— Привет, Билаабо! Так рад тебя снова видеть. Только твои лекции такие хорошие и понятные. Не то, что эта Java Memory Model.

— Да, Билаабо умеет выбирать лекции. Сегодня я расскажу тебе про switch.

— Так мне уже про него рассказывали, кажется.

— Элли. Амиго не хочет слушать лекцию про switch? Может, начнешь свою?

— Хочу, хочу. Давай про switch.

— Ок. В Java есть такой оператор — Java switch. Он удобен, когда тебе нужно выполнить определенные действия в зависимости от различных значений некоторой переменной.

Пример со switch Аналогичный код
int i = 5;
switch(i)
{
 case 1: 
  System.out.println("один"); 
  break;
 case 2: 
  System.out.println("два"); 
  break;
 case 3: 
  System.out.println("три"); 
  break;
 default: 
  System.out.println("много");
}
int i = 5;
if (i==1)
{
 System.out.println("один");
}
else if (i==2)
{
 System.out.println("два");
}
else if (i==3)
{
 System.out.println("три");
}
else 
{
 System.out.println("много");
}

Оператор switch позволяет прыгнуть на нужный кусок кода, если значение переданной в него переменной совпадает со значением, указанным после слова case.

Если i равно 1, то выполнение перейдет на строку помеченную «case 1».

Если i равно 2, то выполнение перейдет на строку помеченную «case 2».

Если i равно 3, то выполнение перейдет на строку помеченную «case 3».

Если переход не выполнился на какой-либо из case’ов, то выполняется на блок, помеченный «default:»

— Ясно. А справа – это та же самая логика, но реализованная с помощью if-ов?

— Ага.

— А что это еще за слово break? Ты же говорил, что его можно использовать только в циклах?

— Да, можно и здесь. При выполнении команды break мы тут же выходим из switch.

Но если команду break убрать, то все строки внутри switch’а будут выполняться до конца.

Пример Вывод, если i=1 Вывод, если i=2
switch(i)
{
 case 1: 
  System.out.println("один"); 
 case 2: 
  System.out.println("два"); 
 case 3: 
  System.out.println("три");
 default: 
  System.out.println("много"); }
один
два
три
много
два
три
много

Фактически, case – это метки в коде, и в switch мы прыгаем на очередную метку и… начинаем исполнять весь код до конца switch’а, или пока не встретим break.

— Т.е. если мы не напишем break, то сначала выполнится строчка, на которую мы перепрыгнули, а потом все остальные до закрывающей фигурной скобки «}». Так?

— Да.

— Ничего сложного. Но мне больше нравится с использованием if-ов. Там нет этих бессмысленных break.

— Очень часто if действительно компактнее. Но иногда switch более читабельный.

Сравни:

Пример со switch Аналогичный код
public String getName(int i)
{
 switch(i)
 {
  case 1: 
   return "один";
  case 2: 
   return "два";
  case 3: 
   return "три";
  default: 
   return "много";
}
public String getName(int i)
{
 if (i==1)
  return "один";

 if (i==2)
  return "два";

 if (i==3)
  return "три";

return "много"
}

— Не сказал бы, что читабельней.

— Ладно, а как насчет такого примера?

Пример со switch Аналогичный код
public String getName(int i)
{
 switch(i)
 {
  case 1: 
  case 2: 
   return "один или два";
  case 3: 
  case 4: 
  case 5: 
   return "от трех до пяти";
  default: 
   return "много";
}
public String getName(int i)
{
 if (i==1 || i==2)
  return "один или два";

 if (i==3 || i==4 || i==5)
  return "от трех до пяти";

return "много"
}

— Что-то Билаабо у тебя не очень-то и выходит. Так break можно не писать, когда return?

— Ага. return сразу приведет к выходу из метода.

— Что-то все время c if-ами выходит компактнее. Но с switch в этот раз вышло читабельней.

— Фух, наконец-то.

Еще одна вещь. Можно не писать default в конце. Тогда просто ничего не произойдет, если ни одна из меток не совпадет.

— Ну, точно, как if-else… но читабельней, гораздо читабельней!

— Отлично. Рад, что тебе понравилась моя лекция.

Чуть не забыл. Изначально внутри switch можно было использовать переменные только примитивных типов и enum’ы. Но теперь туда добавили и поддержку типа String.

— Т.е. я могу написать так:

Пример
public int getNumber(String number)
{
 switch(number)
 {
  case "one": 
   return 1;
  case "two": 
   return 2;
  case "three": 
   return 3;
  default: 
   return -1;
 }
}

— Ага. Правда, удобно?

— Да. Отличная штука switch!