Oracle официально представила новую общедоступную версию Java 17. Три ключевых изменения: использование только строгой семантики чисел с плавающей точкой, единый API (прикладной программный интерфейс) для генераторов псевдослучайных чисел и отдельный API сторонних функций и памяти.
В Java 17 включили четырнадцать 14 JEP (предложений по улучшению). Разработчики закрыли свыше 2,7 тыс. задач и серьезно обновили API.
Всегда строгая семантика
В JEP 306 восстановили всегда строгую семантику чисел с плавающей точкой. Напомним, до Java 1.2 по умолчанию использовалась нестрогая семантика. Теперь же на всех платформах выражения с плавающей точкой вычисляются строго, а значит, можно не использовать ключевое слово strictfp – если оно будет обнаружено в коде, система выдаст предупреждение.
Это нововведение должно упростить разработку библиотек, которые чувствительны к числовым значениям. От введения всегда строгой семантики точно выиграют Java.lang.Math и java.lang.StrictMath и другие подобные решения.
API сторонних функций и памяти
В рамках JEP 412 создали Foreign Function & Memory API. Это продвинутая версия нативного интерфейса JNI, в которой по умолчанию запрещены потенциально небезопасные операции. Это повысит стабильность кода и производительность его выполнения.
С новым API можно также по-разному взаимодействовать с памятью вне кучи. А в будущем – задействовать внешние функции не только на С, но и на других языках.
Но JNI по-прежнему доступен. Если ваше приложение использует его, переход на Java 17 не будет критичным.
Изменения в фильтрах
В Java 9 появились фильтры для контроля десериализации данных. В 17 версии их сделали более гибкими – в JEP 415 внедрили фабрику фильтров.
Вы можете не указывать конкретный фильтр для каждого объекта ObjectInputStream и не запускать глобальный статический фильтр для всей виртуальной машины. Достаточно указать статическую фабрику, например, через метод ObjectInputFilter.Config::setSerialFilterFactory или аргументы командной строки. Она автоматически будет возвращать нужный фильтр в зависимости от контекста.
Фильтры нужны для проверки входящих потоков данных, которые поступали со стороны библиотеки и кода приложения. Так как можно удалить потенциально вредоносный код прямо в процессе десериализации, безопасность разработки повысится.
API для генераторов псевдослучайных чисел
В JEP 356 добавили пакет java.util.random с новыми интерфейсами и свежей реализацией генераторов псевдослучайных чисел. В этой иерархии RandomGenerator является родителем для свежих генераторов SplittableRandomGenerator, JumpableRandomGenerator, LeapableRandomGenerator, ArbitrarilyJumpableRandomGenerator, а также ранее использованных инструментов – Random, ThreadLocalRandom и SplittableRandom.
Механизм ServiceLoader позволяет использовать собственные или сторонние реализации генераторов. Это актуально для финансовых и беттинг-приложений, а также других разработок со сложной криптографией.
Новый рендер-конвейер
С JEP 382 разработчики перешли от OpenGL на Apple Metal API.
Обновленный рендер-конвейер соответствует модели существующего двумерного аналога. Он пока включен по умолчанию, но можно активировать и новую версию ключом -Dsun.java2d.metal=true. Если же OpenGL не работает, то используется Apple Metal.
Здесь же отметим, что разработчики сделали специальный порт под архитектуру macOS/AArch64. Для процессоров Apple M1 уже выложены дистрибутивы открытого OpenJDK и проприетарного Oracle JDK.
Строгая инкапсуляция внутренних API
В Java 9 показали инкапсуляцию внутренних прикладных интерфейсов, но до 16 версии включительно она была выключена по умолчанию. Теперь, с внедрением JEP 403, ее нельзя включить единственной командой --illegal-access=permit Main.
Чтобы иметь доступ к внутренним компонентам JDK, необходимо явно перечислить все нужные пакеты в опциях --add-opens или --add-exports. Но критического API в модуле jdk.unsupported эти изменения не касаются: все классы в пакетах sun.misc и sun.reflect по-прежнему доступны по умолчанию.
Java 17 – LTS-версия с расширенной поддержкой
Java 17 – стабильная версия с LTS (Long-Term Support) поддержкой: ожидается, что она продлится до сентября 2026 года. Предыдущая LTS-версия JDK 11 была выпущена три года назад.
Релиз Java 17 в традиционном формате OpenJDK выпускается со свободной лицензией GNU General Public License v2. Для тех, кто использует Java как часть продукта либо сервиса Oracle или же хочет получить платную поддержку, есть коммерческая лицензия.