Публикация

Что нового в Java 11?

Спустя два релиза Java 9 и Java 10 мы получаем TLS релиз Java 11, который смело, можем начинать использовать в своих проектах, но для начало давайте посмотрим, что же тут нового.

JEP 181: Nest-Based Access Control

Была решена проблема доступа к полям вложенных классов, используя рефлексию. Проще говоря, когда мы пытаемся полученному полю Field проставить значение, мы получали IllegalAccessException, как показано в примере ниже:

import java.lang.reflect.Field;

public class JEP181Example {

  public static class NestedClass1 {
    public void someFunction() throws Exception {
      final NestedClass2 nestedClass2 = new NestedClass2();
      nestedClass2.nestedVariable = 2; // работает
      
      final Field field = NestedClass2.class.getDeclaredField("nestedVariable");
      field.setInt(nestedClass2, 2); // бросает IllegalAccessException
    }
  }

  public static class NestedClass2 {
    private int nestedVariable;
  }

  public static void main(String[] args) throws Exception {
    new NestedClass1().someFunction();
  }
}

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

JEP 309: Dynamic Class-File Constants

Новая запись пула констант CONSTANT_Dynamic будет добавлена в файлы классов, где создание такой записи будет делегировано методу начальной загрузки, например, invokedynamic вызова во время выполнения.

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

JEP 315: Improve Aarch64 Intrinsics

Были улучшены встроенные математические функции, такие как Math.cos() и Math.sin(), используемые для архитектуры AArch64 (ARM).

JEP 318: Epsilon. A No-Op Garbage Collector

Добавлен сборщик мусора, позволяющий более гибко тестировать производительность и/или отслеживание выполнение чрезвычайно короткоживущих задач.

Epsilon - сборщик мусора, который ничего не делает.

На самом деле это не сборщик мусора, он не будет собирать мусор. И добавлен исключительно в целях тестирования и отладки.

JEP 320: Remove the Java EE and CORBA Modules

Устаревшие модули в Java 9 такие как: Java EE и COBRA были удалены. Соответственно, следующие пакеты удалены из JDK 11:

  • 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.

Также, удален CosNamingProvider. А Java RMI более не будет предоставлять IDL и IIOP заглушки.

JEP 321: HTTP Client (Standard)

HTTP Client который был в инкубаторном состоянии в Java 9 и Java 10 теперь является стандартом Java 11 модуля java.net.http. API поддерживает как HTTP 1.1, HTTP 2, а также WebSocket.

Пример использования нового HTTP Client:

public class JEP321Example {
  public static void main(String[] args) throws Exception {
    final HttpClient client = HttpClient.newBuilder()
        .version(Version.HTTP_2)
        .build();
    
    final HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("https://bcode.dev"))
        .build();

    // Synchronous Call
    final HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
    System.out.println(response.statusCode())

    // Asynchronous Call
    client.sendAsync(request, BodyHandlers.ofString())
        .thenApply(HttpResponse::statusCode)
        .thenAccept(System.out::println)
        .get();
  }
}

JEP 323: Local-Variable Syntax for Lambda Parameters

Еще в Java 10 было представлено новое ключевое слово var для объявления локальных переменных. Давайте вспомним как это выглядело:

var numer = 10;

Однако мы не могли их использовать в lambda выражениях. Соответственно в JEP 323 это исправил и теперь это стало возможно:

var numbers = new int[] {11, 2, 3, 14, 5, 23};
int sum = Arrays.stream(numbers)
            .filter((var number) -> number < 10)
            .sum();

JEP 324: Key Agreement with Curve25519 and Curve448

RFC 7748, ключевое соглашение с использованием Curve25519 и Curve448 реализовано в провайдере SunEC.

JEP 327: Unicode 10

Java 11 теперь поддерживает Unicode 10. Поскольку Java 10 поддерживает Unicode 8, это означает, что будут внесены изменения как в Unicode 9, так и в Unicode 10.

Однако алгоритм сортировки Unicode, механизмы безопасности Unicode и обработка совместимости Unicode IDNA и Unicode Emoji не будут реализованы.

JEP 328: Flight Recorder

Flight Recorder - это среда сбора данных/событий с низкими накладными расходами (менее 1% воздействия на производительность).

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

JEP 329: ChaCha20 and Poly1305 Cryptographic Algorithms

Алгоритмы ChaCha20 и Poly1305 уписаны в RFC 7539 будут реализованы в провайдере SunJCE.

JEP 330: Launch Single-File Source-Code Programs

Теперь стало возможно выполнить один Java файл:

java MyHelloWorldApp.java

Также стало возможно сделать файл выполняемым, для этого достаточно добавить в качестве первой строки #!/path/to/java -source 11 и поменять расширение файла на другое, кроме .java.

JEP 331: Low-Overhead Heap Profiling

Используя новый JVMTI SampledObjectAlloc callback, можно будет отслеживать (конкретные или выборочные) выделения кучи и их расположение в среде с низкими накладными расходами.

JEP 332: Transport Layer Security (TLS) 1.3

Теперь поддерживается TLS 1.3, но без поддержки данных 0-RTT, аутентификации после установления связи и временных меток подписанного сертификата (SCT) (RFC 6962).

JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)

Представлен экспериментальный сборщик мусора с малой задержкой, назван он Z Garbage Collector или ZGC, целью которого является максимальное время паузы 10 мили секунд и влияние на производительность не более 15% по сравнению со сборщиком мусора G1.

На данный момент он будет поддерживаться только на платформе Linux/x64.

JEP 335: Deprecate the Nashorn JavaScript Engine

Nashorn был помечен как устаревший с возможным удалением в будущем.

JEP 336: Deprecate the Pack200 Tools and API

Инструменты сжатия Pack200, которые используются для файлов JAR, теперь устарели и будут удалены в будущем.

Опубликовано: 2 апреля 2021 г.Просмотров: 107

Комментарии

Мы не даем слово анониму 😶
Войдите, пожалуйста.

Еще никто не комментировал эту публикацию 🤔