Особенности Java 11

Мы еще не полностью погрузились в Java 10, а здесь уже Java 11. Java 11 важна по многим причинам. Oracle пересмотрела свою модель поддержки и предложила поезд обновлений, который будет приносить быстрые обновления примерно каждые 6 месяцев. Они изменили лицензионную и модель поддержки, что означает, что если вы загрузите Oracle JDK Java 11, это будет платным для коммерческого использования.

Это означает, что мне теперь нужно платить за Java? НЕТ. Не обязательно, если вы загружаете Oracle JDK и используете его в производстве.

Примечание: IntelliJ IDEA 2018.2.4 Community Edition уже поддерживает Java 11.

1. Почему Java 11 важна?

Java 11 – это второй выпуск LTS после Java 8. С Java 11 Oracle JDK больше не будет бесплатным для коммерческого использования. Вы можете использовать его на этапе разработки, но для коммерческого использования вам нужно купить лицензию. В противном случае вы можете получить счет-фактуру от Oracle в любой день! Java 10 была последней бесплатной версией Oracle JDK, которую можно было загрузить. Oracle прекратит поддержку Java 8 с января 2019 года. Вам придется платить за дополнительную поддержку. Вы можете продолжать использовать ее, но не получите обновлений/обновлений безопасности.

Oracle больше не будет предоставлять бесплатную долгосрочную поддержку (LTS) для какой-либо отдельной версии Java с момента Java 11.

Хотя Oracle JDK больше не бесплатен, вы всегда можете загрузить сборки Open JDK из Oracle или других поставщиков, таких как AdoptOpenJDK, Azul, IBM, Red Hat и т. д. По моему мнению, если вы не ищете использование на уровне предприятия с желанием платить за обслуживание, вы можете использовать OpenJDK и обновлять их при необходимости.

2. Какую сборку JDK мне следует загрузить и какие преимущества у каждой из них?

Поскольку Oracle создал поезд релизов, в котором новая версия будет выпускаться каждые шесть месяцев, если вы используете бесплатный Open JDK от Oracle, вам придется обновлять его каждые шесть месяцев, поскольку Oracle не будет предоставлять бесплатные обновления после выпуска новой версии. Это может быть вызовом для адаптации в компании. Оплатите коммерческую поддержку Oracle и переходите только с одной версии LTS на следующую версию LTS. Таким образом, вы получите все обновления и поддержку для Java 11 до 2026 года. Вы можете загрузить Java 17 в 2022 году. Оставайтесь на бесплатной версии Java даже после окончания ее поддержки. Хотя вы не будете получать обновления безопасности, и это может открыть уязвимости в безопасности.

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

Поняв, с какими обязательствами приходит Java 11, давайте теперь проанализируем важные функции Java 11 для разработчиков. Мы также обсудим некоторые важные JEP. Примечание: JavaFX будет доступен как отдельный модуль и не будет привязан к графику выпуска Java JDK каждые 6 месяцев.

3. Как скачать бесплатную версию Java 11?

Вы можете скачать готовую к использованию производственную версию OpenJDK по этой ссылке. Бинарные файлы представлены в форматах tar или zip, поэтому просто распакуйте их и установите переменные среды для использования компилятора java и команд java.

4. Функции Java 11

Некоторые из важных функций Java 11:

  • Запуск файла Java одной командой
  • Новые утилитарные методы в классе String
  • Синтаксис локальных переменных для параметров лямбда-выражений
  • Контроль доступа на основе вложенных объектов
  • JEP 321: HTTP-клиент
  • Чтение/запись строк в файлы
  • JEP 328: Регистратор полетов

Давайте обсудим новые функции, введенные в Java 11 в рамках процесса JEP.

4.1) Запуск файла Java одной командой

Одно из основных изменений заключается в том, что вам не нужно сначала компилировать исходный файл Java с помощью инструмента javac. Вы можете сразу запустить файл с помощью команды java, и он будет неявно скомпилирован. Эта функция входит в JEP 330. Вот краткий обзор новых методов класса Java String, введенных в Java 11:

4.2) Методы строки Java

isBlank() – Этот метод экземпляра возвращает логическое значение. Пустые строки и строки только из пробелов считаются пустыми.

import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        // Ваш код здесь!
        
        System.out.println(" ".isBlank()); //true
        
        String s = "Anupam";
        System.out.println(s.isBlank()); //false
        String s1 = "";
        System.out.println(s1.isBlank()); //true
    }
}

lines() Этот метод возвращает поток строк, который представляет собой коллекцию всех подстрок, разделенных строками.

import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) throws Exception {
        
        String str = "JD\nJD\nJD"; 
        System.out.println(str);
        System.out.println(str.lines().collect(Collectors.toList()));
    }
}

Вывод вышеуказанного кода: strip(), stripLeading(), stripTrailing() strip() – Удаляет пробелы с начала и конца строки.

Но у нас уже есть trim(). Тогда зачем нужен strip()? strip() – это “Unicode-осведомленное” развитие trim(). Когда был введен trim(), Unicode еще не развился. Теперь новый метод strip() удаляет все виды пробелов в начале и в конце (проверьте метод Character.isWhitespace(c), чтобы узнать, является ли символ Unicode пробелом или нет)

Приведен пример использования вышеуказанных трех методов:

public class Main {
    public static void main(String[] args) throws Exception {
        // Ваш код здесь!
        
        String str = " JD "; 
        System.out.print("Start");
        System.out.print(str.strip());
        System.out.println("End");
        
        System.out.print("Start");
        System.out.print(str.stripLeading());
        System.out.println("End");
        
        System.out.print("Start");
        System.out.print(str.stripTrailing());
        System.out.println("End");
    }
}

Вывод в консоль из вышеприведенного кода: repeat(int) Метод repeat просто повторяет строку такое количество раз, как указано в методе в форме int.

public class Main {
    public static void main(String[] args) throws Exception {
        // Ваш код здесь!
        
        String str = "=".repeat(2);
        System.out.println(str); //prints ==
    }
}

4.3) Локальный синтаксис переменных для параметров лямбда-выражений

JEP 323, Локальный синтаксис переменных для параметров лямбда – единственная функция языка, выпущенная в Java 11. В Java 10 была введена Локальная переменная с неявным выводом типа. Таким образом, мы могли выводить тип переменной из правой части – var list = new ArrayList<String>(); JEP 323 позволяет использовать var для объявления формальных параметров лямбда-выражения с неявным типом. Мы можем теперь определить:

(var s1, var s2) -> s1 + s2

Это было возможно также в Java 8, но было удалено в Java 10. Теперь это вернулось в Java 11, чтобы сохранить единообразие. Но зачем это нужно, когда мы можем просто пропустить тип в лямбда-выражении? Если вам нужно применить аннотацию, как @Nullable, вы не можете сделать это без определения типа. Ограничение этой функции – Вы должны указать тип var для всех параметров или ни для одного. Вещи, подобные следующим, невозможны:

(var s1, s2) -> s1 + s2 //no skipping allowed
(var s1, String y) -> s1 + y //no mixing allowed

var s1 -> s1 //not allowed. Need parentheses if you use var in lambda.

4.4) Контроль доступа на основе вложенности

До Java 11 это было возможно:

public class Main {
 
    public void myPublic() {
    }
 
    private void myPrivate() {
    }
 
    class Nested {
 
        public void nestedPublic() {
            myPrivate();
        }
    }
}

частный метод главного класса доступен из вышеперечисленного класса вышеперечисленным образом. Но если мы используем Рефлексию Java, это вызовет IllegalStateException.

Method method = ob.getClass().getDeclaredMethod("myPrivate");
method.invoke(ob);

Контроль доступа к вложенным объектам в Java 11 решает эту проблему в отражении. java.lang.Class представляет три метода в API отражения: getNestHost(), getNestMembers() и isNestmateOf().

4.5) JEP 309: Динамические константы класс-файлов

Формат класс-файла Java теперь расширяет поддержку новой формы постоянного пула, CONSTANT_Dynamic. Цель этого JEP – снизить затраты и нарушения при разработке новых форм материализуемых ограничений класс-файлов, создав одну новую форму постоянного пула, которая может быть параметризована поведением, предоставленным пользователем. Это повышает производительность

4.6) JEP 318: Epsilon: Нетоповый сборщик мусора

В отличие от сборщика мусора JVM, который отвечает за выделение памяти и ее освобождение, Epsilon выделяет память только. Он выделяет память для следующих вещей:

  • Тестирование производительности.
  • Тестирование нагрузки на память.
  • Тестирование интерфейса ВМ.
  • Крайне коротковременные задания.
  • Улучшения задержки на последнем шаге.
  • Улучшения пропускной способности на последнем шаге.

Теперь Elipson хорош только для тестовых сред. Это приведет к OutOfMemoryError в продакшене и краху приложений. Преимущество Elipson в том, что нет накладных расходов на очистку памяти. Следовательно, он даст точный результат тестирования производительности, и мы больше не можем использовать GC для его остановки. Примечание: это экспериментальная функция.

4.7) JEP 320: Удаление модулей Java EE и CORBA

Модули уже были признаны устаревшими в Java 9. Теперь они полностью удалены. Следующие пакеты удалены: java.xml.ws, java.xml.bind, java.activation, java.xml.ws.annotation, java.corba, java.transaction, java.se.ee, jdk.xml.ws, jdk.xml.bind

4.8) JEP 328: Flight Recorder

Регистратор полетов, который ранее был коммерческим дополнением в Oracle JDK, теперь является открытым исходным кодом, поскольку сам Oracle JDK больше не бесплатен. JFR – это инструмент профилирования, используемый для сбора диагностических данных и профилирования из запущенного приложения Java. Его производительность почти ничтожна и обычно составляет менее 1%. Поэтому его можно использовать в производственных приложениях.

4.9) JEP 321: HTTP-клиент

Java 11 стандартизирует API клиента HTTP. Новый API поддерживает как HTTP/1.1, так и HTTP/2. Он разработан для повышения общей производительности отправки запросов клиентом и получения ответов от сервера. Он также нативно поддерживает веб-сокеты.

4.10) Чтение/запись строк в/из файлов

Java 11 стремится облегчить чтение и запись строк. Он ввел следующие методы для чтения и записи в/из файлов:

  • readString()
  • writeString()

Приведенный ниже код демонстрирует пример этого.

Path path = Files.writeString(Files.createTempFile("test", ".txt"), "This was posted on JD");
System.out.println(path);
String s = Files.readString(path);
System.out.println(s); //This was posted on JD

4.11) JEP 329: Криптографические алгоритмы ChaCha20 и Poly1305

Java 11 предоставляет реализации шифров ChaCha20 и ChaCha20-Poly1305. Эти алгоритмы будут реализованы в провайдере SunJCE.

4.12) JEP 315: Улучшение интринсиков Aarch64

Улучшение существующих интринсиков строк и массивов, а также реализация новых интринсиков для функций sin, cos и log в java.lang.Math на процессорах AArch64.

4.13) JEP 333: ZGC: Масштабируемый сборщик мусора с низкой задержкой (экспериментальный)

Java 11 ввел низколатентный GC. Это экспериментальная функция. Приятно видеть, что Oracle уделяет внимание сборщикам мусора.

4.14) JEP 335: Устаревший движок JavaScript Nashorn

Движок Nashorn JavaScript и его API устарели, что указывает на то, что они будут удалены в последующих версиях.

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

Мы рассмотрели важные функции и обновления, предоставленные в Java 11. Увидимся скоро, когда выйдет Java 12.

Source:
https://www.digitalocean.com/community/tutorials/java-11-features