«1. Обзор

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

2. Зачем нужны предварительные версии функций

Как, наверное, уже всем ясно, выпуски функций Java выпускаются каждые шесть месяцев. Это означает меньшее время ожидания новых функций Java, но в то же время меньше времени на реакцию на отзывы о новых функциях.

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

Должен быть способ обеспечить стабильность новых функций. Что еще более важно, они должны соответствовать потребностям общества. Но как?

Благодаря JEP-12 в поставки могут быть включены «язык обзора и функции виртуальной машины». Таким образом, сообщество может проверить новые функции в реальных сценариях — однако, конечно, не в производственной среде.

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

3. Предварительные версии и экспериментальные функции

Предварительные версии Java — это полностью определенные и разработанные функции, проходящие оценку. Следовательно, они просто еще не достигли конечного состояния.

Из-за высокого качества различные реализации JDK должны включать все предварительные функции, запланированные в каждой поставке Java. Однако выпуск Java по-прежнему не может поддерживать функции предварительного просмотра из более ранних выпусков.

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

Вот что JEP-12 говорит о предварительных функциях:

A preview language or VM feature is a new feature whose design, specification, and implementation are all complete, but which would benefit from a period of broad exposure and evaluation before either achieving final and permanent status in the Java SE Platform or else being refined or removed.

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

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

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

Функции предварительного просмотра отключены по умолчанию. Чтобы включить их, мы должны использовать аргумент enable-preview, который включает все функции предварительного просмотра одновременно.

Компилятор Java, а также JVM должны иметь ту же версию Java, которая включает функцию предварительного просмотра, которую мы хотим использовать.

Давайте попробуем скомпилировать и запустить фрагмент кода, который использует текстовые блоки, функцию предварительного просмотра в JDK 13:

String query = """
    SELECT 'Hello World'
    FROM DUAL;
    """;
System.out.println(query);

Конечно, нам нужно убедиться, что мы используем JDK 13 с нашей любимой IDE. Мы можем, например, загрузить выпуск 13 OpenJDK и добавить его в среду выполнения Java нашей IDE.

4.1. С Eclipse

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

Нам нужно щелкнуть правой кнопкой мыши по проекту и выбрать «Свойства» во всплывающем меню. Далее переходим к компилятору Java. Теперь мы можем включить функции предварительного просмотра либо для этого конкретного проекта, либо для всей рабочей области.

Далее мы должны снять флажок Использовать настройки соответствия по умолчанию, и только после этого мы можем отметить Включить функции предварительного просмотра для Java 13:

4.2. С IntelliJ IDEA

Как и следовало ожидать, код также не будет компилироваться в IntelliJ по умолчанию, даже с Java 13, и мы получим сообщение об ошибке, похожее на то, что мы видели в Eclipse.

Мы можем включить функции предварительного просмотра из структуры проекта в меню «Файл». В Project нам нужно выбрать 13 (предварительный просмотр) в качестве уровня языка проекта:

Это должно подойти. Однако, если ошибка все еще сохраняется, мы должны вручную добавить аргументы компилятора, чтобы включить функции предварительного просмотра. Предполагая, что это проект Maven, подключаемый модуль компилятора в pom.xml должен содержать:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>13</source>
                <target>13</target>
                <compilerArgs>
                    --enable-preview
                </compilerArgs>
            </configuration>
        </plugin>
    </plugins>
</build>

«

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

4.3. Из командной строки

javac --release 13 --enable-preview ClassUsingTextBlocks.java

Во время компиляции команде javac требуются два аргумента — enable-preview и release:

Напомним, что выпуск JDK N не поддерживает функции предварительного просмотра выпуска N-1 или любые предыдущие выпуски. Следовательно, мы получим ошибку, если попытаемся выполнить предыдущую команду с помощью JDK 14.

Короче говоря, аргумент выпуска должен установить N в используемую версию выпуска JDK компилятора (и JVM), чтобы включить функции предварительного просмотра.

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

java --enable-preview ClassUsingTextBlocks

Во время выполнения команде java требуется только аргумент enable-preview:

Однако будет выполняться только код, использующий функции предварительного просмотра этого конкретного выпуска JDK.

5. Заключение

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