Найти в Дзене
Анастасия Софт

Урок 15 для Java-разработчика. 💻💡 Java switch: от первых шагов до магии выражений

Если вы когда-либо писали цепочку if-else-if-else-if, то знаете, что это может быстро превратиться в нечитаемого монстра. А что если мы скажем вам, что в Java есть оператор, который работает как телепорт: мгновенно переносит вас к нужному блоку кода? Знакомьтесь — оператор switch. Сегодня мы разложим его по полочкам, от классики до Java 14+, и пройдемся по 8 уникальным задачам: от самых простых до продвинутых. Оператор switch выбирает, какой блок кода выполнить, основываясь на значении выражения. 📌 Принцип работы: int day = 3;
switch (day) {
case 1:
System.out.println("Понедельник");
break;
case 2:
System.out.println("Вторник");
break;
case 3:
System.out.println("Среда");
break;
default:
System.out.println("Неизвестный день");
} 💬 Комментарии: int level = 2;
switch (level) {
case 1:
System.out.println("Новичок");
case 2:
System.out.println("Средний");
case 3:
System.out.print
Оглавление
Урок 15 для Java-разработчика. 💻💡 Java switch: от первых шагов до магии выражений
Урок 15 для Java-разработчика. 💻💡 Java switch: от первых шагов до магии выражений

🧭 Введение

Если вы когда-либо писали цепочку if-else-if-else-if, то знаете, что это может быстро превратиться в нечитаемого монстра. А что если мы скажем вам, что в Java есть оператор, который работает как телепорт: мгновенно переносит вас к нужному блоку кода? Знакомьтесь — оператор switch.

Сегодня мы разложим его по полочкам, от классики до Java 14+, и пройдемся по 8 уникальным задачам: от самых простых до продвинутых.

🔄 Что такое switch?

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

📌 Принцип работы:

  1. Вычисляется значение выражения.
  2. Сравнивается с "ключами" в блоках case.
  3. При совпадении выполняется соответствующий блок.
  4. Выход из switch обеспечивается оператором break.
  5. Если совпадений нет — выполняется default (если он есть).

⚠️ Важные нюансы

  • Ключи (case) должны быть константами.
  • Тип должен быть совместим с выражением: int, char, String, enum и их обёртки (Integer, Character и т.д.).
  • Значения ключей не должны повторяться в одной области.

📦 Пример 1. Классический switch на старом добром int

int day = 3;

switch (day) {
case 1:
System.out.println("Понедельник");
break;
case 2:
System.out.println("Вторник");
break;
case 3:
System.out.println("Среда");
break;
default:
System.out.println("Неизвестный день");
}

💬 Комментарии:

  • switch (day) — сравниваем day со значениями ниже.
  • case 3: — совпало? Печатаем "Среда".
  • break; — не дадим другим case выполняться случайно.
  • default: — запасной план, если day — это, скажем, 99.

📦 Пример 2. Без break — эффекты падения

int level = 2;

switch (level) {
case 1:
System.out.println("Новичок");
case 2:
System.out.println("Средний");
case 3:
System.out.println("Продвинутый");
break;
}

🧠 Вывод:

Средний
Продвинутый

❗ Без break выполнение продолжается дальше — иногда это фича, иногда баг. Следите!

📦 Пример 3. String в switch (Java 7+)

String command = "START";

switch (command) {
case "START":
System.out.println("Запуск...");
break;
case "STOP":
System.out.println("Остановка...");
break;
default:
System.out.println("Неизвестная команда");
}

📚 Работает с String, потому что Java сравнивает строки через equals().

📦 Пример 4. Объединение кейсов (Java 14+)

int number = 4;

switch (number) {
case 2, 4, 6, 8 -> System.out.println("Четное");
case 1, 3, 5, 7 -> System.out.println("Нечетное");
default -> System.out.println("За пределами диапазона");
}

🆕 Новая запись с -> не требует break и выглядит опрятно!

📦 Пример 5. switch как выражение (Java 14+)

String status = "MODERATOR";

int accessLevel = switch (status) {
case "GUEST" -> 0;
case "USER" -> 1;
case "MODERATOR" -> 2;
case "ADMIN" -> 3;
default -> -1;
};

System.out.println("Уровень доступа: " + accessLevel);

🧠 Здесь switch возвращает значение — как будто это метод!

📦 Пример 6. Используем yield в блоке

String browser = "Firefox";

int supportScore = switch (browser) {
case "Chrome", "Edge" -> 10;
case "Firefox" -> {
System.out.println("Дополнительная проверка для Firefox...");
yield 8;
}
default -> 5;
};

📌 yield — это новый способ возвращать значение из блока.

📦 Пример 7. Перечисления enum и switch

enum Priority {
LOW, MEDIUM, HIGH
}

Priority task = Priority.HIGH;

switch (task) {
case LOW -> System.out.println("Можно подождать");
case MEDIUM -> System.out.println("Лучше заняться этим сегодня");
case HIGH -> System.out.println("Срочно выполнить!");
}

🛠 enum отлично сочетается с switch, повышая читаемость кода.

📦 Пример 8. Применение switch в методе

public static String moodByHour(int hour) {
return switch (hour) {
case 6, 7, 8 -> "Просыпаюсь...";
case 9, 10, 11 -> "Работаю (вроде)";
case 12 -> "Обед!";
case 18, 19 -> "Домой!";
default -> "Без настроения";
};
}

🔄 Такой метод легко читается, а switch делает код компактным.

🎯 Мини-тест: Проверь себя

  1. Что произойдёт при выполнении кода:

int x = 5;
switch (x) {
case 4:
case 5:
case 6:
System.out.println("В диапазоне 4–6");
break;
default:
System.out.println("Не в диапазоне");
}

а) Ошибка компиляции

б) Не в диапазоне

в) В диапазоне 4–6

г) Ничего не произойдёт

  1. Какая конструкция вернёт значение?

а) switch с break

б) switch с yield

в) switch-case с void

г) if-else без return

🧩 Задача на закрепление

Реализуйте метод, который принимает название месяца и возвращает количество дней в нём. Используйте switch с yield.

Подсказка: февраль — особенный парень 😄

public static int daysInMonth(String month) {
// Вставьте реализацию здесь
}

📌 Выводы

  • switch — мощная альтернатива if-else, особенно при множестве вариантов.
  • Новые возможности (с ->, yield, enum, String) делают код лаконичнее.
  • Но помните: используйте switch, когда нужно проверить одно значение против множества известных.

✅ Ответы на мини-тест

  1. в) В диапазоне 4–6
  2. б) switch с yield

🧠 Пояснение задачи по строчкам:

Задача на закрепление
Реализуйте метод, который принимает название месяца и возвращает количество дней в нём. Используйте switch с yield.
Задача на закрепление Реализуйте метод, который принимает название месяца и возвращает количество дней в нём. Используйте switch с yield.

return switch (month.toLowerCase()) {

  • Мы сразу приводим строку к нижнему регистру, чтобы January, january, JANUARY — всё обрабатывалось одинаково.

case "january", "march", "may", "july", "august", "october", "december" -> {
System.out.println("Месяц с 31 днём");
yield 31;
}

  • Группируем все месяцы с 31 днём. -> указывает, что мы используем выражение switch, не нужно писать break.

case "april", "june", "september", "november" -> {
System.out.println("Месяц с 30 днями");
yield 30;
}

  • Точно так же группируем месяцы с 30 днями.

case "february" -> {
System.out.println("Февраль, стандартные 28 дней");
yield 28;
}

  • Специальный случай — февраль. В реальной жизни может быть и 29 дней (високосный год), но мы опускаем это для простоты.

default -> {
System.out.println("Некорректное название месяца: " + month);
yield -1;
}

  • Обрабатываем ситуацию, если введено что-то непонятное, например "Hello" или "Mars". Возвращаем -1.

✅ Пример использования

public static void main(String[] args) {
System.out.println(daysInMonth("January")); // 31
System.out.println(daysInMonth("April")); // 30
System.out.println(daysInMonth("February")); // 28
System.out.println(daysInMonth("Unknown")); // -1
}

Подписывайтесь, дальше интереснее 👍