Обзор функций
Java 18 стала общедоступной с 22 марта 2022 года. Этот выпуск обеспечивает тысячи улучшений производительности, стабильности и безопасности. Он также включает усовершенствования (JEP) платформы для повышения производительности труда разработчиков.
Вы можете загрузить готовые к использованию двоичные файлы, доступные в Oracle. Конкретная версия другого поставщика — WIP.
ПРИМЕЧАНИЕ. Oracle JDK 18 не является выпуском с долгосрочной поддержкой (LTS).
Предложения по усовершенствованию JDK, реализованные в Java 18
- JEP 400: UTF-8 по умолчанию
Устанавливает UTF-8 в качестве кодировки по умолчанию для стандартных API Java. С этим изменением API-интерфейсы, зависящие от кодировки по умолчанию, будут вести себя одинаково во всех реализациях, операционных системах, локалях и конфигурациях. - JEP 408: Простой веб-сервер
Инструмент командной строки и API для запуска минимального веб-сервера, обслуживающего только статические файлы. Этот инструмент будет полезен при создании прототипов, специальном программировании и тестировании, особенно в образовательных целях. - JEP 418: SPI разрешения интернет-адресов
Определяет интерфейс поставщика услуг (SPI) для разрешения имен хостов и адресов, чтобы java.net.InetAddress мог использовать преобразователи, отличные от встроенных в платформу. резольвер. - JEP 413: Фрагменты кода JEP в документации API Java
Представлен тег @snippet для стандартного доклета JavaDoc, чтобы упростить включение примера исходного кода в документацию API. - JEP 416: Повторная реализация Core Reflection с дескрипторами методов Повторно реализует java.lang.reflect.Method, Constructor и Field поверх дескрипторов методов java.lang.invoke. Заставляя метод обрабатывать базовый механизм отражения, он снижает затраты на обслуживание и разработку как API java.lang.reflect, так и java.lang.invoke.
Предварительный просмотр функций, которые будут выпущены в будущих версиях
- JEP 417: Vector API (третий инкубатор)
Представляет независимый от платформы надежный способ четкого и лаконичного выражения широкого спектра векторных вычислений для поддерживаемых архитектур ЦП. - JEP 419: API внешних функций и памяти (Второй инкубатор)
Значительно упрощает инструменты и знания, необходимые для создания программ Java, использующих нативный код. Это позволит разработчикам Java получить доступ к специализированным библиотекам, отличным от Java. - JEP 420: Сопоставление шаблонов для switch (вторая предварительная версия)
Повышает производительность разработки Java за счет расширения выразительности и применимости выражений и операторов switch. Разрешение сопоставления шаблонов в коммутаторе сделает выражение сложных запросов, ориентированных на данные, более лаконичным и безопасным.
Устаревшие
JEP 421: Устаревшая Finalization для удаления Подготавливает разработчиков к возможному будущему удалению устаревшей функции Finalization, предоставляя простые инструменты, помогающие обнаружить зависимость от устаревшей функциональности.
Ключевое прохождение JEP
JEP400 — UTF-8 по умолчанию
Разработчики Java давно столкнулись с тем, что стандартный набор символов Java меняется в зависимости от операционной системы и языковых настроек. Набор символов по умолчанию был определен во время выполнения и зависел от локали пользователя и кодировки по умолчанию.
Например, в Windows кодировка была windows-1252, а в macOS — UTF-8.
В Java 18 UTF-8 будет использоваться по умолчанию для всех операционных систем.
Вот пример одной из многих проблем, когда набор символов различается в разных операционных системах:
// Run this code in Linux or MacOS try (FileWriter fw = new FileWriter("happy-coding.txt"); BufferedWriter bw = new BufferedWriter(fw)) { bw.write("ハッピーコーディング!"); } // Then Load the file in Windows try (FileReader fr = new FileReader("happy-coding.txt"); BufferedReader br = new BufferedReader(fr)) { String line = br.readLine(); System.out.println(line); } //The following output is displayed. That is because Linux and macOS store the file in UTF-8 format, and Windows tries to read it in Windows-1252 format. ãƒ?ッピーコーディングï¼? //Credit to @SvenWoltmann
JEP 408 Простой веб-сервер
Почти все современные языки программирования позволяют запустить элементарный HTTP-сервер, например, для быстрого тестирования некоторых веб-функций.
В JEP408 самым простым способом запуска веб-сервера является команда jwebserver. Он запускает сервер на локальном хосте: 8000 и предоставляет файловый браузер для текущего каталога.
ПРИМЕЧАНИЕ. Рекомендуется для прототипирования, тестирования и отладки.
Если вам интересно, можете ли вы реализовать полноценный производственный веб-сервер с помощью простых API-интерфейсов веб-сервера, ответ — нет. Веб-сервер не предназначен для такого использования. Он очень примитивен и имеет следующие ограничения:
- Единственный поддерживаемый протокол — HTTP/1.1.
- HTTPS не предусмотрен.
- Разрешены только методы HTTP GET и HEAD.
JEP418 - SPI разрешения интернет-адресов
Как правило, чтобы узнать IP-адрес(а) для имени хоста в Java, мы можем использовать InetAddress.getByName(…) или InetAddress.getAllByName(…). InetAddress, в свою очередь, использует преобразователь операционной системы (файл hosts и настроенные DNS-серверы).
Эта жесткость препятствует созданию прототипов и тестированию. Кроме того, это затрудняет интеграцию с новыми сетевыми протоколами.
Предложение по улучшению JDK 418 представляет интерфейс поставщика услуг (SPI), позволяющий заменить встроенный в платформу преобразователь по умолчанию другими преобразователями.
JEP 413 — Фрагменты кода в документации Java API
Разработчики в основном вставляют образцы кода в комментарии Javadoc, используя аннотацию @code. Этот метод несколько ограничен и требует обходных путей.
В качестве нового подхода JEP 413 предлагает использовать тег @snippet. Как указано в JEP, тег «может использоваться для объявления как встроенных фрагментов кода, где фрагмент кода включен в сам тег, так и внешних фрагментов, где фрагмент кода считывается из отдельного исходного файла».
Утилита Javadoc также включает параметры для указания ссылок, выделения кода и т. д. См. JEP 413 для более подробной информации.
Вот два примера встроенного сниппета с функциями выделения:
/** * * {@snippet : * try (BufferedWriter writer = Files.newBufferedWriter(path)) { * writer.write(text); * } * } */ /** * * {@snippet : * try (BufferedWriter writer = Files.newBufferedWriter(path)) { * writer.write(text); // @highlight substring="text" * } * } */
JEP 416: повторная реализация Core Reflection с дескрипторами методов
Рефлексия позволяет выполняемой Java-программе исследовать или «самоанализировать» себя и манипулировать внутренними свойствами программы.
Если вы раньше использовали отражение Java, вы знаете, что существует несколько способов анализа/изменения возможностей класса во время выполнения. Оно включает:
- Основное отражение
- Дескрипторы методов
- Использование нативных методов
Поддержка всех трех вариантов требует значительных усилий для разработчиков JDK. Поэтому в рамках Предложения по улучшению JDK 416 было решено повторно реализовать код классов отражения java.lang.reflect.Method, Field и Constructor с использованием дескриптора метода и, таким образом, сократить усилия по разработке.
Краткое содержание
Помимо предложений по улучшению JDK, представленных в этом посте, есть еще множество улучшений производительности, стабильности и безопасности.
Полный список можно найти в Примечаниях к выпуску JDK 18.
Также ознакомьтесь с дополнительными сведениями по ссылкам в справочном разделе ниже.
Рекомендации
Объявление Java GA
https://jdk.java.net/18/
Загрузки
https://openjdk.java.net/projects/jdk/18/
Примечания к выпуску JDK 18
https://jdk.java.net/18/release-notes
Пресс-релиз
https://www.oracle.com/news/announcement/oracle-releases-java-18-2022-03-22/
Технический блог Oracle
https://blogs.oracle.com/java/post/the-arrival-of-java-18
Статья о Java 18 от Redhat
https://developers.redhat.com/articles/2022/01/27/whats-new-developers-java-18
Углубленный обзор Java 18 с примерами
https://www.happycoders.eu/java/java-18-features/
Удачного кодирования!