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 одразу призведе до виходу з методу.

— Щось весь час з 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!