В switch-выражениях break будет заменён на yield

Улучшенный оператор switch, который появился в Java 12 в статусе Preview, будет слегка изменён в Java 13 и будет продолжать оставаться в статусе Preview. Единственным изменением будет замена оператора break, служащего для возврата значения из блока, на yield:

int j = switch (day) {
    case MONDAY -> 0;
    case TUESDAY -> 1;
    case -> {
        case k = day.toString().length();
        case result = f(k);
        case result;
    }
};

Проблема с оператором break заключается в том, что конструкция break value; выглядит как выход из цикла по метке value. Чтобы избежать этой неоднозначности, изначально было предложено заменить оператор break на break-with, чтобы было бы первым в истории языка ключевым словом, содержащим дефис. Такое ключевое слово решило бы проблему, при этом не ломая обратную совместимость, однако позже было предложено заменить break-with на более короткое yield. Так как yield никогда не было зарезервированным ключевым словом в Java, то единственный способ его введения – сделать его контекстно-зависимым, то есть оно будет восприниматься как ключевое слово только в определённом строго специфицированном контексте. Например, последовательность yield = 1 не пострадает и будет продолжать интерпретироваться как присваивание переменной yield. Аналогичная стратегия уже применялась в Java 9, где символы module, exports, requires и т.д. интерпретировались как ключевые слова только в контексте декларации модулей, при этом во всех остальных местах программы эти слова можно было свободно использовать в качестве идентификаторов.

Подписывайтесь на канал в Telegram, чтобы не пропускать новости.

Все материалы на этом сайте выложены под лицензией CC BY-SA 4.0
© Евгений Козлов, 2017-2020