Сегодня мы рассмотрим тему того, что принесет следующий LTS релиз JDK 21.

Первая информация о JDK 21

Пока мы все с нетерпением ждем скорого выхода JDK 20, список функций, которые появятся в JDK 21 этой осенью, также постепенно уточняется.

Начнем с JEP, которые уже были официально предложены в рамках осеннего релиза. Так, все указывает на то, что мы получим там предварительную версию шаблонов строк (String Templates). Их цель — стать расширением текстовых блоков, представленных в JDK 15. Шаблоны строк упрощают их заполнение (а также обычных строк) динамическими значениями.

Чтобы лучше представить это, посмотрим на один пример из JEP:

String name    = "Joan Smith";
String phone   = "555-123-4567";
String address = "1 Maple Drive, Anytown";
String json = STR."""
     {
         "name":    "\{name}",
         "phone":   "\{phone}",
         "address": "\{address}"
     }
     """;

Также возможно передавать и целые выражения:

 int x = 10;
 int y = 20;
 String s = STR."\{x} + \{y} = \{x + y}"; // 10 + 20 = 30 

Все это дело основано на так называемых процессорах, в приведенных выше примерах использовался STR., который просто выполняют интерполяцию. 

В самом JDK также появился процессор FMT., который позволяет выполнять дополнительное форматирование, например, определять десятичную точность float. Пользователь также сможет определить пользовательские процессоры. Получившийся механизм выглядит очень гибким и выходит далеко за рамки простого заполнения строк переменными.

Еще одним уже анонсированным дополнением является JEP 431: Sequenced Collections. До сих пор в JDK не было интерфейса, который мог бы определять коллекции с элементами в четко определенном порядке, обеспечивая при этом удобную итерацию вперед и назад по элементам. По этой причине, в основном, каждая существующая коллекция подходила к этой теме по-разному:

Поэтому в JDK появится интерфейс, основанный на реализации Deque:

interface SequencedCollection<E> extends Collection<E> {
     SequencedCollection<E> reversed();
     void addFirst(E);
     void addLast(E);
     E getFirst();
     E getLast();
     E removeFirst();
     E removeLast();
}

В дополнение к улучшенной поддержке операций над первым и последним элементами, также благодаря внедрению метода reversed() станет проще выполнять итерации по коллекции в обратном порядке.

Чтобы закрыть тему, я довольно улыбнулся, увидев цитату Сёрена Кьеркегора в свежей сводке JEP
Чтобы закрыть тему, я довольно улыбнулся, увидев цитату Сёрена Кьеркегора в свежей сводке JEP

Однако это еще не все — все указывает на то, что мы также получим еще два JEP в JDK 21 — Record Patterns и Pattern Matching for Switch

Как отмечается на Reddit /r/java, хотя оба JEP все еще остаются в Draft, примеры кода в них явно относятся именно к JDK 21. Так что, похоже, «осень будет принадлежать» Project Amber.

И раз уж мы затронули тему Pattern Matching и деконструкции записей (record deconstruction), разработчики JDK не планируют останавливаться на достигнутом. На прошлой неделе Брайан Гетц опубликовал анализ паттернов деконструкции о возможности реализации деконструкции объектов, отличных от записей. 

В этом документе предлагается ввести деконструкторы, которые являются обобщением решений, созданных для записей. 

Они должны позволять выполнение деструктукции любого класса, в котором они объявлены. Деконструкторы должны быть определены явно и требуют точного соответствия.

Приведенный ниже пример показывает, как они могут выглядеть, хотя Брайан Гетц предупреждает, что все последующее предназначено только для иллюстрации и не должно считаться окончательным или каким-либо еще.

class Point {
     final double x, y;

     public Point(double x, double y) {
         this.x = x;
         this.y = y;
     }

     public matcher Point(double x, double y) {
         x = this.x;
         y = this.y;
     }
}

Таким образом, они должны быть чем-то вроде обратных конструкторов, потому что они должны собирать значения полей данного объекта и представлять их как легко извлекаемые из класса.

Просто для протокола (хех) также стоит упомянуть, что JDK 21 будет LTS релизом (Long-Time Support - релизом с длительной поддержкой). 

Так что будем надеяться, что он будет максимально насыщен функционально, потому что это будет JDK, рекомендованный для производственного использования на долгие годы.

Возможно, именно этот релиз убедит еще одну группу пользователей JDK в том, что стоит перейти на новую версию.
Возможно, именно этот релиз убедит еще одну группу пользователей JDK в том, что стоит перейти на новую версию.

Источники

Комментарии (6)


  1. zloddey
    00.00.0000 00:00

    Новости хорошие! Вот только паттерны относятся не к деконструкции, а к деструктуризации. Давайте, пожалуйста, обойдёмся без постмодернизма в этом посте (экзистенциализма уже более чем достаточно)!


    1. zloddey
      00.00.0000 00:00

      Агггрх, по ссылкам таки и деконструкция используется. Ушёл читать философский словарь...


    1. val6852 Автор
      00.00.0000 00:00

      Brian Goetz published an analysis of Deconstruction patterns


  1. Kolyan01
    00.00.0000 00:00

    2-е предложение 2-го абзаца - "...что мы получим" что?)
    Подсказка: предварительную версию шаблонов строк.


    1. val6852 Автор
      00.00.0000 00:00

      Спасибо большое! Исправил.


  1. AstarothAst
    00.00.0000 00:00

    Еще virtual threads в 21 версии зафиналят вроде как.