Вчера на сайте OpenJDK появился новый JEP 325, в котором предлагается ввести в язык улучшенный оператор switch
. Мотивацией для введения является то, что старый switch
имеет несколько фундаментальных изъянов, которые нельзя исправить, не нарушив обратную совместимость. Во-первых, старый switch
является императивной конструкцией, которая не может возвращать выражения и заставляет писать большое количество повторяющегося кода. Во-вторых, старый switch
всегда являлся большим источником ошибок из-за своей необходимости явно завершать ветви оператором break
, отсутствие которого приводит к «проваливанию» (fall-through). Кроме того, старый switch
не имеет возможности обработать случай, когда аргумент является null
.
Новый switch
решает все вышеописанные проблемы: он может возвращать значения, сокращает объём необходимого кода, меньше провоцирует на ошибки и позволяет обрабатывать null
.
В новом switch
оператор break
сможет возвращать значения:
case LABEL: break expression;
Того же самого эффекта также можно достигнуть с использованием более короткой формы:
case LABEL -> expression;
Ветви switch
будут поддерживать множественные варианты:
case SATURDAY, SUNDAY -> "weekend";
Обработка null
:
case null -> expression;
Кроме всего прочего, новый switch
упразднит необходимость явного написания ветви default
, если он покрывает все возможные значения перечисления:
int numLetters = switch (day) { // DayOfWeek day case MONDAY, FRIDAY, SUNDAY -> 6; case TUESDAY -> 7; case THURSDAY, SATURDAY -> 8; case WEDNESDAY -> 9; }
JEP 325 является только началом, и в дальнейшем планируется добавить в switch
поддержку полноценного паттерн-матчинга.