• Вышел новый черновик JEP: Virtual Threads. В нём предлагается финализировать виртуальные потоки в Java 21, то есть они больше не будут Preview API. Единственным изменением относительно Java 20 будет поддержка ThreadLocal
переменных в виртуальных потоках. Это гарантирует, что многие существующие библиотеки, использующие ThreadLocal
, продолжат корректно работать при переходе на виртуальные потоки.
• Вышел новый JEP 443: Unnamed Patterns and Variables (Preview). Про него мы писали в выпуске #46, когда вышел его черновик. С тех пор принципиальных изменений в JEP внесено не было.
• Вышел новый JEP 442: Foreign Function & Memory API (Third Preview). Таким образом, в Java 21 API остаётся в статусе Preview в третий раз.
• Вышел новый черновик JEP: Launch Multi-File Source-Code Programs. В нём предлагается добавить поддержку запуска программ, состоящих из нескольких исходных файлов .java
. Напомним, что сейчас Java поддерживает запуск только одного исходного файла (возможность, которая появилась в Java 11).
Предполагается, что запуск нескольких файлов будет работать следующим образом:
- • В аргумент командной строки по-прежнему передаётся название одного java-файла, например:
java Prog.java
. - • Если класс ссылается на другие классы, то лаунчер пытается найти эти классы в файловой системе. Предполагается, что каждый класс находится в файле с именем, соответствующем имени класса.
- • Файлы, на которые никто не ссылается, не компилируются. Это может быть удобно для разработки (например, в них можно оставлять синтаксические ошибки).
- • Если класс используется через рефлексию, то файл ищется и компилируется уже во время работы программы.
- • Использование пакетов поддерживается. В таком случае файлы должны лежать в соответствующих директориях.
- • Использование библиотек также поддерживается. Тогда нужно добавить аргумент
-cp
, например:java -cp '*' Prog.java
.
• JEP 401: Primitive Classes (Preview) был значительно переработан и переименован в Null-Restricted Value Object Storage. В новой версии JEP предлагается ввести так называемые опциональные конструкторы и null-restricted типы.
Смысл опциональных конструкторов заключается в том, что если в value-классе объявлен такой конструктор, то такой класс обязан поддерживать значение по умолчанию, то есть значение, в котором все поля являются нулями. Это значит, что объекты такого класса могут быть проинициализированы в обход конструктора, а значит потенциально нарушать инварианты класса. В результате класс становится менее безопасным, но зато даёт виртуальной машине больше возможностей для более компактного хранения его значений: value-классы с опциональными конструкторами могут иметь лучший flattening, чем просто value-классы.
JEP также предлагает ввести переменные, которым не может быть присвоен null
. Причём это нововведение будет распространяться на все классы, в том числе и ссылочные. Поскольку null-restricted типы не связаны напрямую с value-классами, то они будут подробно описаны в отдельном JEP'е (на данный момент ссылка выдаёт 404, т.к. JEP ещё не стал общедоступным). Однако в контексте этого JEP'а они упомянуты, чтобы показать, что они играют важную роль, когда сочетаются с value-классами с опциональными конструкторами: их значения смогут встраиваться в другие объекты и массивы, что и было основной целью проекта Valhalla.
Также важным изменением в JEP'е стал отказ от нотации X.ref
и X.val
. Вместо них будет восклицательный знак для обозначения null-restricted типов (X!
).
• Вышел Eclipse 2023-03.
• Вышел JavaFX 20. С этой версии фреймворк требует Java 17 в качестве минимальной версии Java.
• Вышел выпуск Java Annotated Monthly от JetBrains за март.
• Вышел maven-surefire-plugin 3.0.0. Это первое обновление плагина Maven для запуска тестов спустя почти 4 года.