Tehnografi.com - Технологические новости, обзоры и советы
[adinserter block="67"]

Что нового в Java 17?

Примечание. Следующая статья поможет вам: Что нового в Java 17?

Версия Long-Term-Support (LTS) языка Java и платформы среды выполнения Java 17 была запущена 14 сентября 2021 года. Давайте узнаем, что нового в Java 17 и стоит ли вам обновляться.

Многие приложения используют более старые версии Java, в том числе более ранние LTS-версии Java: Java 11 и Java 8.

Почему компаниям следует перейти на самую последнюю версию Java? Обновление до Java 17 требует усилий, в основном для того, чтобы максимально использовать новые возможности и функции внутри JVM.

Многие компании используют Docker и образы Docker для простого перехода на Java 17 с минимальными усилиями и временем. Разработчики могут определить свои конвейеры непрерывной интеграции/развертывания (CI/CD) и запускать все в образах Docker. Это не повлияет на другие команды, использующие более старые версии Java, поскольку они могут использовать старые образы Docker.

ЯВА 17 Особенности

Поддержка macOS и AArch64

Одной из важнейших функций JVM, добавленных в эту версию, является улучшенная поддержка macOS на архитектуре AArch64 с использованием JEP 391. Она будет поддерживать последнюю серию процессоров (M1), выпущенную Apple для своих компьютеров в прошлом году.

Для пользователей этих платформ это не обязательно имеет большое значение, поскольку некоторые поставщики выпустили версии JDK, которые поддерживают эту архитектуру и даже возвращают поддержку из Java 8. Однако официальная печать одобрения необходима для обеспечения будущего обслуживания и поддержки Платформа. Для сравнения, поддержка платформы Linux/AArch64 была добавлена ​​в Java 9 и Windows/AArch64 в Java 16.

Запечатанные классы

Запечатанные классы — это функция, представленная в Java 17. Функция запечатанных классов завершила свою пробную фазу и стала официальной платформой и языком в Java 17. Она позволяет разработчику указывать допустимые подтипы, которые может иметь тип, и запретить другим расширять или реализовывать его не по назначению.

Запечатанные классы также позволяют компилятору генерировать ошибки во время компиляции, когда вы пытаетесь преобразовать незапечатанный тип в неразрешенный подтип. Java 17 также предоставляет новый конвейер рендеринга для приложений AWT/Swing, которые работают в macOS с использованием Apple Metal API вместо OpenGL. Он имеет улучшенный API и расширенные функции для генерации случайных чисел.

Изменения, удаления и ограничения в Java 17

Java 17 также содержит несколько изменений, удалений и новых ограничений.

Инкапсуляция внутренних компонентов JDK

Одним из изменений является завершение процесса инкапсуляции JDK Internals. Впервые это было представлено в Java 9 и выдавало предупреждения во время выполнения, когда пользователь пытался использовать отражение или подобное, чтобы обойти обычные ограничения на использование внутренних API. Также были добавлены аргументы командной строки для регулирования этого поведения.

Начиная с Java 9, были созданы различные API, предлагающие единый способ выполнения наиболее часто используемых задач; пользователи будут использовать эти API внутри компании. В Java 16 значение по умолчанию было изменено с предупреждения на отключение доступа к созданию исключения. Однако он использует аргумент командной строки для изменения поведения.

В Java 17 аргумент командной строки устранен, и это ограничение можно отключить. Это означает, что любой несанкционированный доступ к этим внутренним API теперь защищен.

Всегда строгая семантика с плавающей запятой

Дополнительное «удаление» можно описать как повторное введение семантики Always-Strict Floating Point. В Java 1.2 были внесены изменения в семантику с плавающей запятой по умолчанию в Java, которая позволяет JVM жертвовать незначительной точностью в вычислениях с плавающей запятой для повышения производительности. В классах и методах, где нужно было использовать строгую семантику, было добавлено ключевое слово strictfp. С тех пор в ЦП были введены различные типы наборов инструкций, что позволяет использовать строгую семантику с плавающей запятой без ненужных затрат. Устранена необходимость реализации стандартной или строгой семантики.

Java 17 удаляет предыдущую семантику по умолчанию, и все операции с плавающей запятой выполняются строго. Термин strictfpi все еще присутствует. Однако это не имеет никакого эффекта и вызывает предупреждение во время компиляции.

Опережающая компиляция (AOT)

Java 9 представила компиляцию с опережением времени (AOT) в качестве экспериментальной функции, использующей компилятор Graal, а JIT-код был написан с использованием Java. Java 10 сделала компилятор Graal пригодным для использования в качестве JIT-компилятора в OpenJDK за счет включения интерфейса JVMCI. С тех пор, как он был выпущен, он значительно улучшился. Компилятор Graal добился огромных успехов и имеет свою JVM под названием GraalVM.

Активация RMI

Активация RMI была исключена в JEP 407 после ее удаления из Java 8 и, наконец, признана устаревшей и помечена как требование для удаления в Java 15. Активация RMI предоставила метод для включения ресурсов распределенных объектов по запросу с использованием RMI. Тем не менее, он использовался минимально, и в настоящее время доступна лучшая альтернатива. На оставшуюся часть RMI не влияет устранение части активации.

Удаление API апплета

Applet API, наконец, был назначен для удаления JEP 398, первоначально удаленным в Java 9. Applet API предоставил способ интеграции элементов управления Java AWT/Swing в веб-страницу в браузере. Однако ни один современный браузер не поддерживает это, а это означает, что апплеты были практически недоступны в течение последнего десятилетия или около того.

Менеджер по безопасности

Наиболее важным устаревшим является менеджер безопасности (JEP 411). Менеджер безопасности используется некоторое время, начиная с Java 1.0. Он был разработан для ограничения того, что Java может делать локально на машине, например, ограничения доступа к сетям, файлам и другим сетевым ресурсам. Он также пытается поместить в песочницу ненадежный код, блокируя отражение и определенные API.

Конец диспетчера безопасности начался в Java 12. Был добавлен аргумент командной строки, чтобы заблокировать использование диспетчера безопасности во время выполнения. Изменение, внесенное в Java 17, означает, что предупреждение во время выполнения будет генерироваться в JVM при попытке установить диспетчер безопасности либо из командной строки, либо динамически во время выполнения.

Инкубатор и функции предварительного просмотра

Многие задавались вопросом, будут ли в Java 17 какие-либо функции предварительного просмотра и инкубации, учитывая, что Java 17 продвигалась как версия с долгосрочной поддержкой. В Java 17 есть два модуля-инкубатора и функция предварительного просмотра!

Векторный API

Vector API (JEP 414) в настоящее время находится на втором этапе инкубатора. API позволяет разработчикам определять векторные вычисления, которые компилятор JIT затем преобразует в соответствующие векторные инструкции, поддерживаемые архитектурой ЦП, на которой работает JVM (например, с использованием наборов инструкций SSE или AVX).

Раньше разработчикам приходилось использовать скалярные функции или создавать собственные библиотеки, специфичные для платформы. Реализация Vector API на Java также обеспечивает плавный резервный механизм, который был сложным в более ранних версиях.

Стандартизация Vector API позволяет использовать его классам в JDK. Методы mismatch() массивов Java можно было бы изменить, чтобы вместо этого запускать их на Java, устраняя необходимость поддерживать и писать несколько реализаций для конкретных платформ в JVM.

Внешние функции и API памяти

Дополнительная функция инкубатора называется API внешних функций и памяти (JEP 412). Это эволюция и слияние двух других модулей-инкубаторов Java 16, а именно API-интерфейса внешней компоновки (JEP 389) и API внешней памяти (JEP 393). Оба они обеспечивают доступ к собственной памяти и коду, используя статически типизированное программирование, написанное на Java.

Сопоставление шаблонов для коммутатора

Последней функцией предварительного просмотра языка, включенного в Java 17, является включение сопоставления шаблонов для коммутатора (JEP 406). Эта языковая функция расширяет выражения и операторы переключения в соответствии с типом, аналогично синтаксису, используемому в сопоставлении с образцом (JEP 394), который стал стандартом в Java 16.

В прошлом, если вы хотели выполнять различные действия, основанные на динамическом характере объекта, вам нужно было построить цепочку if-else, используя экземпляр проверок, таких как:

Тип строки (объект o) { if (o instanceof List) { return “Список вещей.”; } else if (o instanceof Map) { return “Карта! У нее есть ключи и значения.”; } else if (o instanceof String) { return “Это строка.”; } else { return “Это что-то другое.”; } }

Комбинируя выражение переключения и новую функцию сопоставления шаблонов для переключателей, процесс можно сократить до чего-то похожего на:

Строковый тип (Объект o) { return switch (o) { case List l -> “Список вещей.”; case Map m -> “Карта! У нее есть ключи и значения.”; case String s -> “Это строка.”; по умолчанию -> “Это что-то другое.”; }; }

Как вы могли заметить, в процессе проверки происходит объявление переменной. Как и другие переменные в Pattern, сопоставление экземпляра указывает, что этот объект был проверен на тип и приведен и доступен из переменной в его текущей области.

Функция предварительного просмотра — это еще один шаг к сопоставлению с образцом. Следующим шагом является включение возможности деконструкции массивов и записей.

Стоит ли переходить на Java 17?

Да, вы должны постоянно обновляться до самой последней версии, но не сразу. Программное обеспечение и библиотеки, которые вы используете, возможно, не были обновлены для обеспечения совместимости с Java 17, поэтому вам может потребоваться подождать некоторое время, пока это не будет сделано.

Если вы застряли с LTS-версией Java, такой как Java 8 или Java 11, в языке и в самой JVM есть множество опций, которые требуют обновления до Java 17. Поскольку это выпуск с долгосрочным обслуживанием, есть высока вероятность того, что ваша производственная среда в конечном итоге также будет обновлена ​​​​до Java 17.

Если вы начинаете совершенно новый проект или находитесь в процессе подготовки своего проекта к Java 17, переход на Java 17 скорее раньше, чем позже, вероятно, является наиболее эффективным выбором, поскольку это снижает затраты на переезд. Это также позволяет разработчикам, работающим над проектом, использовать все новейшие функции и операционную сторону.

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