Чем switch-выражение (case L -> …) надёжнее старого switch?
Стрелочный case L -> не проваливается и не требует break; switch-выражение возвращает значение (для блока — yield); по enum и sealed-типам компилятор проверяет полноту — забытый вариант даёт ошибку компиляции.
- Несколько меток: case SAT, SUN -> "выходной"
- Java 21: pattern matching в case и guard-условия when
- case null — явная обработка null вместо NPE
А ещё Старый switch с двоеточием тоже доступен, но без проверки полноты в statement-форме
Подробно
case L -> … не проваливается и не требует break, а всё выражение возвращает значение (для блока — через yield). Главный выигрыш — исчерпываемость: switch по enum или sealed-типу обязан покрыть все варианты, и компилятор это проверяет. Это надёжнее старого statement-switch с легко забываемым break.
Пример
String kind = switch (day) {
case SAT, SUN -> "выходной";
case MON, TUE, WED, THU, FRI -> {
log(day);
yield "рабочий";
}
};Что хотят услышать
- Отсутствие fall-through.
- Значение и yield.
- Исчерпываемость.
Частые ошибки
- Ждать fall-through в стрелочном case.
- Забывать yield в блочной ветви.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Оно быстрее на выполнении за счёт JIT
- ✗Оно не требует default даже для int
- ✗Оно допускает fall-through по умолчанию и не требует break, поэтому код получается короче
- ✓Нет fall-through, возвращает значение, по enum и sealed проверяет исчерпываемость
Что спросят дальше
- Что такое исчерпываемость по sealed-типу?
- Когда нужен yield?
Разбор темы
- Современный синтаксис: var, текстовые блоки, switch
Локальный вывод типа var, многострочные текстовые блоки, switch-выражения и другие удобства новых версий.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.