Обзор функций

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/

Удачного кодирования!