Что нового в JDK: горячие фичи

В марте 2024 года выходит JDK 22. В связи с этим радостным событием, хочу кратко рассказать о некоторых новых горячих фичах этого релиза.

Так же упомяну о немного "остывших" фичах, которые были в статусе превъю в JDK 21, а 22 поменяли свой статус.

Не будем тянуть, поехали:)

Выражения перед super(...) (Statements before super(...) (Preview))

Это превью фича в JDK 22.

Хотят разрешить выражения перед super в констркторе, например, для валидации аргументов.

Нельзя будет ссылаться там на экземпляр создаваемого объекта (что логично).

Пример:

public class PositiveBigInteger extends BigInteger { public PositiveBigInteger(long value) { if (value <= 0) throw new IllegalArgumentException("non-positive value"); super(value); } }

Шаблоны строк (String Templates)

Фича будет в статусе Second Preview(в jdk 21 была preview).

Нужна для того, чтобы сделать удобнее работу со строковыми выражениями. Позволит подставлять значения переменных в нужные места строки вместо шаблона вида: \{имя переменной}.

Но этим дело не ограничивается. Фича представляет собой api процессоров шаблонов (template processor). Можно разрабатывать свои реализации этих процессоров, которые позволят, например, безопасно работать с sql или json.

В JDK войдут процессоры шаблонов STR и FMT для работы со строками. Последний позволит ещё форматирование.

На мой взгляд, довольно удобно. Может быть к следующему LTS фича выйдет из статуса preview.

Примеры:

1) Подставляем строки String firstName = "Bill"; String lastName  = "Duck"; String fullName  = STR."\{firstName} \{lastName}";  // "Bill Duck" 2) Можно подставить и целые числа int x = 10, y = 20; String s = STR."\{x} + \{y} = \{x + y}"; // "10 + 20 = 30"

Векторный Api (Vector API (Seventh Incubator))

Фича в 22 все ещё в инкубаторе.

Апи позволит работать с векторными вычислениями и оптимизирует их производительность.

Безымянные переменные и шаблоны (Unnamed Variables & Patterns)

В JDK 21 она объявлена как превью фича, в 22 уже основная.

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

Думаю, не так часто это пригодится, и использовать эту фичу надо вдумчиво. Задать себе вопрос: а оно мне надо? Может можно как-то по-другому написать код?

Пример (из документации, конечно надуманный, зато понятно объясняет смысл):

static int count(Iterable<Order> orders) {     int total = 0;     for (Order _ : orders)    // Unnamed variable         total++;     return total; }

Внешние функции и апи работы с внешней памятью (Foreign Function & Memory API)

В JDK 21 была превъю.

Для получения безопасного доступа к коду и памяти внешней(!) по отношению к среде выполнения Java. Имеет существенные преимущества по сравнению с JNI.

Безымянные классы и методы экземпляра Main(Implicitly Declared Classes and Instance Main Methods)

В JDK 22 будет как Second Preview. В 21-м было Preview.

Когда я начинал изучать Java, то первым делом написал простейшую программу Hello world вида:

public class HelloWorld {     public static void main(String[] args) {         System.out.println("Hello, World!");     } }

А потом потратил кучу времени, чтобы понять, для чего там все эти слова.

Теперь же, с появлением этой фичи, студенты будут меньше ломать голову на начальном этапе изучения Java и не испугаются раньше времени:)

Пример того, как теперь можно будет написать Hello world:

void main() {     System.out.println("Hello, World!"); }

Пожалуй, на сегодня хватит фич, чтобы не сильно Вас утомлять:)

В следующей статье я продолжу рассказ о новых фичах Java.

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

2 комментария