Java 18. Что Нового И Зачем Это Вам Понадобится



Множество интересных функций Выпуск Java 18 запланирован на 22 марта 2022 года, и ждать осталось недолго.

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

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

Компании, если решат перейти на обновление, чаще всего будут ждать полной многолетней поддержки.

Поэтому в 18 версии будет несколько JEP в виде превью и инкубаторов, которые разработчики будут тестировать и давать отзывы.

И в готовом виде эти улучшения войдут в 22-ю версию Java. Теперь у нас есть возможность опробовать новый функционал и понять, насколько он полезен.

И есть что попробовать! В этой статье мы рассмотрим новые JEP и объясним, что они делают и что они делают.



Новые возможности Java 18



JEP 400: использование UTF-8 по умолчанию

Что это: Многие API (включая стандартные API Java) используют в приложениях так называемый «набор символов по умолчанию».

Какой именно, зависит от платформы, будь то Windows, Linux, Mac или другая ОС.

Более того, та же самая кодировка использовалась для сохранения исходных файлов .

java. С 18-й Явы по умолчанию всегда UTF-8 .

Зачем это нужно: В некоторых случаях (особенно если речь шла об азиатских языках и иероглифах) одно и то же приложение, запущенное разными пользователями (даже на одной машине), могло привести к повреждению текста.

Если виртуальная машина считает кодировкой по умолчанию UTF-8, а программа написана, например, на UTF-16, то это может превратить выводимый текст в тарабарщину или даже повлиять на работу компилятора javac. Кстати, об этом стоит помнить при переходе с более ранних версий Java™, который может потребовать перекодирования исходных файлов.

Но начиная с 18 версии эта проблема исчезнет. А при необходимости всегда можно вручную установить другую кодировку по умолчанию.



JEP 408: Простой веб-сервер

Что это: Появится в Java легкий веб-сервер , который можно запустить с помощью простой команды $jwebserver Зачем это нужно: Для тестирования, прототипирования и обучения.

Встроенный сервер, конечно, не предназначен для замены промышленных веб-серверов в конечном продукте.

Но теперь нет необходимости настраивать их только для того, чтобы проверить, работает ли бизнес-логика.

Вы можете программно создавать новые и настраивать существующие обработчики адресов.



JEP 413: фрагменты кода в документации Java API

Что это: Добавлен новый тег @snippet , который используется в комментариях к коду.

Если вы пометите им часть комментария, компилятор проверит его и отформатирует, как если бы это был реальный код. Зачем это нужно: Для вашего удобства! Код в комментариях может содержать кучу ошибок, связанных с человеческим фактором — в первую очередь опечатки.

Конечно, компилятор не сможет превратить плохой код в хороший, но он напомнит вам о пропущенной скобке.

А хорошие, читаемые комментарии могут сэкономить часы работы при анализе чужого и даже вашего собственного кода.



JEP 416: новая реализация Core Reflection через MethodHandle

Что это: Механизм отражения был переписан.

поверх MethodHandles, которые заменяют генерацию байт-кода для Method::invoke, Constructor::newInstance, Field::get и Field::set. Зачем это нужно: За безопасность и скорость, а также за развитие проекта Валгалла.

До этого использовались три механизма API java.lang.reflect: нативные методы виртуальной машины, динамически генерируемые заглушки байт-кода в сочетании с доступом к полям через Unsafe и, собственно, хэндлы методов.

Такое разнообразие сложно поддерживать при добавлении новых функций, таких как примитивные классы и дженерики с поддержкой примитивов.

Сейчас механизм с использованием нативных методов используется только на раннем этапе запуска виртуальной машины.

Чтобы повысить производительность отражения в горячем коде, рекомендуется хранить экземпляры метода, конструктора и поля в статических конечных полях, чтобы JIT оптимизировал их как константы.



JEP 417: Vector API (третий инкубатор)

Что это: Векторный API , представленный в Java 16, в некоторых случаях помогает значительно повысить производительность приложений.

Это позволяет вам вручную писать независимые от платформы векторные алгоритмы на Java™, когда существующая автоматическая векторизация цикла HotSpot не работает для сложного кода.

Зачем это нужно: Выполнение определенных вычислений в таких областях, как финансовые транзакции, машинное обучение и криптография.

Эта версия API находится на третьем этапе инкубатора, согласно отзывам сообщества.

Он содержит новые функции, включая поддержку инструкций ARM Scalable Vector Extension (SVE) и повышенную эффективность векторных операций, которые принимают маски на архитектурах, поддерживающих маскирование аппаратно.



JEP 418: Интерфейс поставщика услуг для разрешения сетевых адресов

Что это: В настоящее время Java™ использует API java.net.InetAddress для разрешения имен хостов Интернет-протокола (IP).

Он, в свою очередь, использует механизм разрешения адресов посредством системного вызова ОС.

Обычно он работает с файлом хостов в сочетании с DNS (системой доменных имен).

Этот JEP реализует Интерфейс поставщика услуг (SPI) и ряд новых классов, позволяющих API java.net.InetAddress использовать другие механизмы разрешения адресов.

Зачем это нужно: Для тестирования, настройки и внедрения DNS на клиенте без выполнения потока операционной системы.

Это позволяет, например, эффективно использовать проект Loom, в котором обработка сетевых запросов не будет мешать одновременной работе множества виртуальных потоков.



JEP 419: API внешних функций и памяти (второй инкубатор)

Что это: Улучшение функции, представленной в более ранней версии для замена Java Native Interface (JNI) на более продвинутую модель разработки используя чистый код Java™.

Этот JEP позволит вам подключать собственные библиотеки, вызывать внешние функции и получать более эффективный доступ к памяти вне кучи.

Во втором режиме инкубации были добавлены новые носители, такие как boolean и MemoryAddress, упрощены API для получения нисходящих вызовов MethodHandles (Java→native) и для управления временными с наши зависимости областей ресурсов.

Представлен обобщенный API-интерфейс разыменования для MemorySegment и MemoryAddress. Зачем это нужно: Для удобного взаимодействия с библиотеками, написанными на других языках.

При таком взаимодействии становится возможным использовать современные Java-идиомы, например, параллельные потоки при передаче данных.



JEP 420: Сопоставление шаблонов для переключателя (второй предварительный просмотр)

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

Раньше эта функция была представлена в режиме предварительного просмотра, а теперь в нее внесены два улучшения.

Во-первых, тест на доминирование требует, чтобы константная метка оператора case всегда предшествовала защищенному экземпляру того же типа.

Это позволяет выражению селектора сопоставлять несколько меток в блоке переключателя.

Кроме того, можно использовать любой тип ссылки.

Взгляните на этот пример:

   

static void error(Object o) { switch(o) { case CharSequence cs -> System.out.println("A sequence of length " + cs.length()); case String s ->

Теги: #программирование #java #dns #кодирование #сопоставление с образцом #reflection #веб-сервер #java18 #фрагмент #vector api #finalizer
Вместе с данным постом часто просматривают: