JDK 20, третий не-LTS-релиз после JDK 17, достиг начальной фазы релиз-кандидата, как заявил Марк Рейнхольд, главный архитектор Java Platform Group в Oracle. Основной репозиторий исходного кода, форкнутый в стабилизационный репозиторий JDK в середине декабря 2022 г. (Rampdown Phase One), определяет набор функций для JDK 20. Критические ошибки, такие как регрессии или серьезные функциональные проблемы, могут быть устранены, но должны быть одобрены в процессе Fix-Request. Согласно графику выпуска, JDK 20 будет официально выпущен 21 марта 2023 года. Стоит отметить, что JEP 438 был добавлен в набор функций в начале марта 2023 года. Окончательный набор из семи (7) новых функций в форме JEP можно разделить на две (2) категории: Основная библиотека Java (Core Java Library) и Спецификация Java (Java Specification). Пять (5) из этих новых функций относятся к категории Core Java Library: JEP 429: Scoped Values (Incubator) JEP 434: Foreign Function & Memory API (Second Preview) JEP 436: Virtual Threads (Second Preview) JEP 437: Structured Concurrency (Second Incubator) JEP 438: Vector API (Fifth Incubator) Две (2) из ​​этих новых функций относятся к категории Java Specification: JEP 432: Record Patterns (Second Preview) JEP 433: Pattern Matching for switch (Fourth Preview) Мы исследуем эти новые возможности и рассмотрим, в каких случаях они подпадают под эгиду четырех основных проектов Java — Amber, Loom, Panama и Valhalla, — разработанных для инкубации ряда компонентов для последующего включения в JDK путем контролируемого слияния. JEP 432, Record Patterns (вторая предварительная версия) включает усовершенствования в ответ на отзывы предыдущего раунда предварительной версии, JEP 405, Record Patterns (предварительная версия). Здесь предлагается усовершенствовать язык с помощью шаблонов записей (record patterns) для деконструкции значений записей. Шаблоны записей могут использоваться в сочетании с шаблонами типов (type patterns), чтобы «обеспечить мощную, декларативную и композиционную форму навигации и обработки данных».  Шаблоны типов недавно были расширены для использования в метках switch case: JEP 420, Pattern Matching for switch (предварительная версия), поставляемый в JDK 17; и JEP 420, Pattern Matching for switch (вторая предварительная версия), поставляемый в JDK 18. Изменения по сравнению с JEP 405 включают: добавлена ​​поддержка вывода типа аргументов общих шаблонов записей; добавлена ​​поддержка шаблонов записей в заголовке расширенного оператора for; и удалена поддержка именованных шаблонов записи. Аналогичным образом JEP 433, Pattern Matching for switch (четвертая предварительная версия), включает в себя усовершенствования в ответ на отзывы предыдущих трех раундов предварительной версии: JEP 427, Pattern Matching for switch (третья предварительная версия), поставляемый в JDK 19; JEP 420, Pattern Matching for switch (вторая предварительная версия), поставляемый в составе JDK 18; и JEP 406, Pattern Matching for switch (предварительная версия), поставляемый в составе JDK 17. Изменения по сравнению с JEP 427 включают: упрощенную грамматику для меток switch; вывод типа аргументов для шаблонов типа generic и шаблонов записей теперь поддерживается в switch выражениях и операторах наряду с другими конструкциями, поддерживающими шаблоны. JEP 429, Scoped Values ​​(Incubator), инкубационный JEP, ранее известный как Extent-Local Variables (Incubator), предлагает возможность совместного использования неизменяемых данных внутри и между потоками. Это предпочтительнее, чем локальные переменные потока, особенно при использовании большого количества виртуальных потоков. JEP 436, Virtual Threads (вторая предварительная версия), предлагает вторую предварительную версию из JEP 425, Виртуальные потоки (предварительная версия), поставляемого в JDK 19, чтобы дать время для дополнительных отзывов и опыта для развития этой функции. Эта функция предоставляет платформе Java виртуальные потоки — легковесные потоки, которые значительно снижают усилия по написанию, поддержке и наблюдению за высокопроизводительными параллельными приложениями для платформы Java. Важно отметить, что в этой предварительной версии нет никаких изменений, кроме небольшого количества API из JEP 425, которые стали постоянными в JDK 19 и, следовательно, не предлагаются во второй предварительной версии. Более подробную информацию о JEP 425 можно найти в этой новости InfoQ и в ролике JEP Café, который сделал Жозе Паумард (José Paumard), представитель разработчиков Java в Java Platform Group в Oracle. В JEP 437 Structured Concurrency (второй инкубатор) предлагается повторно инкубировать эту функцию из JEP 428 Structured Concurrency (инкубатор) из JDK 19, чтобы дать время для получения дополнительных отзывов и опыта. Цель этой функции — упростить многопоточное программирование путем внедрения библиотеки, позволяющей рассматривать несколько задач, выполняемых в разных потоках, как единую единицу работы. Это может упростить обработку и отмену ошибок, повысить надежность и улучшить наблюдаемость. Единственным изменением является обновленный класс StructuredTaskScope для поддержки наследования значений с областью действия (scope) потоками, созданными в области задачи. Это упрощает совместное использование неизменяемых данных между потоками. Более подробную информацию о JEP 428 можно найти в этой новости InfoQ. JEP 434, Foreign Function & Memory API (вторая предварительная версия), включает уточнения, основанные на отзывах, и обеспечивает вторую предварительную версию JEP 424, API внешних функций и памяти (предварительная версия), поставляемого в JDK 19, и соответствующего JEP 419, API внешних функций и памяти (второй инкубатор), поставляемого в JDK 18; и JEP 412, API внешних функций и памяти (инкубатор), поставляемого в JDK 17. Эта функция предоставляет API для Java-приложений для взаимодействия с кодом и данными за пределами среды выполнения Java путем эффективного вызова внешних функций и безопасного доступа к внешней памяти, которая не управляется JVM. Обновления JEP 424 включают: интерфейсы MemorySegment и MemoryAddress унифицированы,  то есть адреса памяти моделируются сегментами памяти нулевой длины; а запечатанный (sealed) интерфейс MemoryLayout был усовершенствован для облегчения использования с JEP 427, Pattern Matching for switch (третья предварительная версия), поставляемого в JDK 19. JEP 438, Vector API (пятый инкубатор), включает усовершенствования в ответ на отзывы предыдущих четырех раундов инкубации: JEP 426, Vector API (четвертый инкубатор), поставляемый в JDK 19; JEP 417, Vector API (третий инкубатор), поставляемый в JDK 18; JEP 414, Vector API (второй инкубатор), поставляемый в JDK 17; и JEP 338, Vector API (Incubator), поставляемый как модуль-инкубатор в JDK 16. Эта функция предлагает усовершенствовать Vector API для загрузки и хранения векторов в и из, MemorySegment как определено JEP 424, API внешних функций и памяти (предварительная версия). В сентябре 2023 года планируется выпустить общедоступный и следующий выпуск LTS. В настоящее время в качестве целевых для JDK 21 предлагается два (2) JEP. JEP 430, String Templates (предварительная версия), функция типа JEP, предлагает усовершенствовать язык программирования Java с помощью шаблонов строк, которые похожи на строковые литералы, но содержат встроенные выражения, которые включаются в шаблон строки во время выполнения.Эта функция была классифицирована как предложенная для цели для JDK 21, но еще не была официально объявлена дата рассмотрения. JEP 431, Sequenced Collections, предлагает ввести «новое семейство интерфейсов, которые представляют концепцию коллекции, элементы которой расположены в строго определенной последовательности или порядке, как структурное свойство коллекции». Это мотивировано отсутствием четко определенного упорядочивания и единообразного набора операций в рамках структуры коллекций. Эта функция была классифицирована как предложенная для цели для JDK 21, но официально еще не объявлена ​​​​дата рассмотрения. Мы можем предположить, какие дополнительные JEP могут быть включены в JDK 21, основываясь на ряде проектов и кандидатов JEP. JEP Draft 8303358, Scoped Values ​​(Preview), представленный Эндрю Хейли и Эндрю Динном, выдающимися инженерами Red Hat, развивает JEP 429, Scoped Values ​​(Incubator), представленный в предстоящем выпуске JDK 20. Ранее известный как Extent-Local Variables (инкубатор) и находящийся под эгидой Project Loom, эта функция предлагает возможность совместного использования неизменяемых данных внутри и между потоками. Это предпочтительнее, чем локальные переменные потока, особенно при использовании большого количества виртуальных потоков. И хотя этот проект еще не достиг статуса кандидата, в описании прямо говорится, что этот JEP будет добавлен в JDK 21. JEP Draft 8277163, Value Objects (Preview), функциональный JEP под эгидой Project Valhalla, предлагает создание объектов-значений — классов значений без идентификации, которые определяют поведение своих экземпляров. Этот проект связан с JEP 401, Primitive Classes (предварительная версия), который все еще находится в статусе кандидата. JEP 435, Asynchronous Stack Trace VM API, функциональный тип JEP, предлагает определить эффективный API для получения асинхронных трассировок вызовов для профилирования из обработчика сигналов с информацией о Java и нативных фреймах. JEP 401, Primitive Classes (Preview) под эгидой Project Valhalla, вводит объявленные разработчиком примитивные классы — специальные виды классов значений — как определено в вышеупомянутом проекте Value Objects (Preview) JEP Draft — которые определяют новые примитивные типы. JEP Draft 8301034, Key Encapsulation Mechanism API, функциональный тип JEP, предлагает: отвечать требованиям реализации стандартных алгоритмов Key Encapsulation Mechanism (KEM); выполнять сценарии использования KEM с помощью протоколов безопасности более высокого уровня; и позволить сервис провайдерам подключать Java или собственные реализации алгоритмов KEM. Этот черновик был недавно обновлен, и включает существенное изменение, в котором был исключен класс DerivedKeyParameterSpec и вместо которого используется размещение полей в списке аргументов метода encapsulate(int from, int to, String algorithm). JEP Draft 8283227, JDK Source Structure, информационный тип JEP, описывает общее расположение и структуру исходного кода JDK и связанных с ним файлов в репозитории JDK. Этот JEP предлагает помочь разработчикам адаптироваться к структуре исходного кода, как описано в JEP 201, Модульный исходный код, поставляемый в JDK 9. JEP Draft 8280389, ClassFile API, предлагает предоставить API для синтаксического анализа, генерации и преобразования файлов классов Java. Этот JEP первоначально будет служить внутренней заменой ASM, фреймворка обработки и анализа байт-кода Java, в JDK с планами открыть его как общедоступный API. Брайан Гетц, архитектор языка Java в Oracle, охарактеризовал ASM как «старую кодовую базу с большим количеством унаследованного багажа» и предоставил справочную информацию о том, как этот проект будет развиваться и в конечном итоге заменит ASM. JEP Draft 8278252, JDK Packaging and Installation Guidelines, информационный JEP, предложил предоставить рекомендации по созданию инсталляторов JDK в macOS, Linux и Windows для снижения риска конфликтов между установками JDK от разных поставщиков JDK. Цель состоит в том, чтобы способствовать улучшению опыта установки обновленных версий JDK путем формализации имен каталогов установки, имен пакетов и других элементов программ установки, которые могут привести к конфликтам. Мы ожидаем, что Oracle очень скоро начнет нацеливать дополнительные JEP на JDK 21.