🧭 Введение
Если вы когда-либо писали цепочку if-else-if-else-if, то знаете, что это может быстро превратиться в нечитаемого монстра. А что если мы скажем вам, что в Java есть оператор, который работает как телепорт: мгновенно переносит вас к нужному блоку кода? Знакомьтесь — оператор switch.
Сегодня мы разложим его по полочкам, от классики до Java 14+, и пройдемся по 8 уникальным задачам: от самых простых до продвинутых.
🔄 Что такое switch?
Оператор switch выбирает, какой блок кода выполнить, основываясь на значении выражения.
📌 Принцип работы:
- Вычисляется значение выражения.
- Сравнивается с "ключами" в блоках case.
- При совпадении выполняется соответствующий блок.
- Выход из switch обеспечивается оператором break.
- Если совпадений нет — выполняется 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 делает код компактным.
🎯 Мини-тест: Проверь себя
- Что произойдёт при выполнении кода:
int x = 5;
switch (x) {
case 4:
case 5:
case 6:
System.out.println("В диапазоне 4–6");
break;
default:
System.out.println("Не в диапазоне");
}
а) Ошибка компиляции
б) Не в диапазоне
в) В диапазоне 4–6
г) Ничего не произойдёт
- Какая конструкция вернёт значение?
а) 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, когда нужно проверить одно значение против множества известных.
✅ Ответы на мини-тест
- в) В диапазоне 4–6
- б) 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
}
Подписывайтесь, дальше интереснее 👍