Новости Java #56

• Вышел новый черновик 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 года.

Подписывайтесь на канал в Telegram, чтобы не пропускать новости.

Все материалы на этом сайте выложены под лицензией CC BY-SA 4.0
© Евгений Козлов, 2017-2024
Feed
Table of JEPs