Компания Oracle выпустила общедоступную версию Java 16. Она получила 17 важных дополнений и улучшений. В их числе: механизм записей для компактного объявления классов, сопоставление шаблонов для оператора instanceof, параллельная обработка потоков сборщиком мусора и инструменты для упаковки автономных приложений.
Гибкость и адаптируемость
Разработчики Java напомнили, что в 2020 году популярный язык программирования отметил 25-летие. Но и на старте, и сейчас Java остается достаточно гибкой, чтобы проекты могли адаптироваться к непрерывно меняющемуся технологическому ландшафту и при этом сохранять независимость от платформы. Все версии языка обратно совместимы. Рост производительности решений достигается за счет ускорения инноваций и без ущерба для безопасности проектов.
Согласно июльскому отчету IDC, по итогам 2019 года более 9 млн разработчиков по всему миру (69% от числа занятых полный рабочий день), использовали Java. По этому показателю язык программирования стал абсолютным лидером рынка.
Сейчас Java 16 доступна для всех разработчиков. Релиз Java 16 в традиционном формате Oracle OpenJDK выполняется со свободной лицензией GNU General Public License v2. Для тех, кто использует его как часть продукта либо сервиса Oracle или же хочет получить платную поддержку, есть коммерческая лицензия.
Oracle JDK 16 получит как минимум два квартальных обновления, а после этого его заменит Oracle JDK 17. Релиз новой Java 17 состоится в сентябре 2021 года, но в раннем доступе эта версия уже есть на официальном портале jdk.java.net.
Разработчики также показали соотношение багов в Java 16, закрытых Oracle и специалистами других проектов, и поблагодарили за поддержку сообщество приверженцев проектов с открытым исходным кодом:
Новые возможности языка
В Java 16 приняли предложение JEP 394 о сопоставлении шаблонов (паттерн-матчинга) для оператора instanceof. Это поможет выразить общую логику в программе более кратко и безопасно, в частности, выполнить условное извлечение компонентов из объектов.
Второе важное нововведение – записи (предложение JEP 395). Они упростят синтаксис объявления классов, которые хранят неглубоко неизменяемые данные. Это улучшит читаемость кода и упростит его поддержку. Теперь можно объявлять статические члены во внутренних классах.
Улучшения виртуальной машины Java (JVM)
В новой версии приняли предложение JEP 376 о параллельной обработке потоков сборщика мусора ZGC. Новый формат позволяет делать паузы до 1 мс внутри точек сохранения состояния сборщика, даже при работе с большими кучами. Удаление последнего источника задержки в сборщике мусора ZGC, по словам разработчиков, значительно повысит производительность приложений.
Внедрение эластичных метапространств (предложение JEP 387) позволит быстрее вернуть операционной системе неиспользуемую память метаданных класса HotSpot. Новая схема распределяет ее более мелкими фрагментами, снижает накладные расходы и фрагментацию загрузчика классов. Решение повысит эффективность использования памяти и ускорит работу приложений на виртуальной машине.
Инструменты и классы
Новый инструмент jdk.jpackage, предложенный в JEP 392, позволяет упаковывать автономные приложения Java. Он поддерживает множество форматов, в том числе msi и exe в Windows, pkg и dmg в macOS, а также deb и rpm в Linux. Вызвать упаковщик можно напрямую, из командной строки или программно через API ToolProvider. Он улучшит взаимодействие с конечным пользователем при установке приложений и упростит развертывание ПО.
В соответствии с JEP 390, классы-обертки примитивных типов (Integer, Double, Character и т.д.) теперь считаются value-based классами – они неизменяемые и создаются через фабрики. Их конструкторы теперь помечены как deprecated for removal. При синхронизации на объектах таких классов на этапе компиляции вы увидите предупреждение.