Улучшенный оператор switch
, который появился в Java 12 в статусе Preview, будет слегка изменён в Java 13 и будет продолжать оставаться в статусе Preview. Единственным изменением будет замена оператора break
, служащего для возврата значения из блока, на yield
:
int j = switch (day) { case MONDAY -> 0; case TUESDAY -> 1; case -> { int k = day.toString().length(); int result = f(k); yield result; } };
Проблема с оператором break
заключается в том, что конструкция break value;
выглядит как выход из цикла по метке value
. Чтобы избежать этой неоднозначности, изначально было предложено заменить оператор break
на break-with
, чтобы было бы первым в истории языка ключевым словом, содержащим дефис. Такое ключевое слово решило бы проблему, при этом не ломая обратную совместимость, однако позже было предложено заменить break-with
на более короткое yield
. Так как yield
никогда не было зарезервированным ключевым словом в Java, то единственный способ его введения – сделать его контекстно-зависимым, то есть оно будет восприниматься как ключевое слово только в определённом строго специфицированном контексте. Например, последовательность yield = 1
не пострадает и будет продолжать интерпретироваться как присваивание переменной yield
. Аналогичная стратегия уже применялась в Java 9, где символы module
, exports
, requires
и т.д. интерпретировались как ключевые слова только в контексте декларации модулей, при этом во всех остальных местах программы эти слова можно было свободно использовать в качестве идентификаторов.