Сегодня мы рассмотрим тему того, что принесет следующий 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 в 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, рекомендованный для производственного использования на долгие годы.
