Рубрики
Без рубрики

Что нового в Java 16

пакет, записи (стандарт), сопоставление с образцом (стандарт), запечатанные типы (второй предварительный просмотр), API доступа к внешней памяти (третий инкубатор), API внешнего компоновщика для замены JNI (инкубатор), векторные API (инкубатор)

Автор оригинала: mkyong.

Java 16 стала общедоступной 16 марта 2021 года, загрузите Java 16 здесь .

Java 16 содержит 17 элементов JEP.

  • 1. JEP 338: Векторный API (Инкубатор)
  • 2. JEP 347: Включить функции языка C++14
  • 3. JEP 357: Переход с Mercurial на Git
  • 4. JEP 369: Переход на GitHub
  • 5. JEP 376: ZGC: Параллельная обработка стека потоков
  • 6. JEP 380: Каналы сокетов Unix-Домена
  • 7. JEP 386: Порт Alpine для Linux
  • 8. JEP 387: Эластичное Метапространство
  • 9. JEP 388: Порт Windows/AArch64
  • 10. JEP 389: API внешнего компоновщика (Инкубатор)
  • 11. JEP 390: Предупреждения для классов, основанных на значениях
  • 12. JEP 392: Упаковочный инструмент
  • 13. JEP 393: API доступа к внешней памяти (Третий инкубатор)
  • 14. JEP 394: Сопоставление с образцом, например
  • 15. ДЖИП 395: Записи
  • 16. JEEP 396: По умолчанию сильно инкапсулируйте внутренние компоненты JDK
  • 17. JEP 397: Закрытые классы (Второй предварительный просмотр)
  • Скачать Исходный Код
  • Рекомендации

Функции разработчика Java 16.

пакет, записи (стандарт), сопоставление с образцом (стандарт), запечатанные типы (второй предварительный просмотр), API доступа к внешней памяти (третий инкубатор), API внешнего компоновщика для замены JNI (инкубатор), векторные API (инкубатор)

1. JEP 338: Векторный API (Инкубатор)

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

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

Дальнейшее Чтение

2. JEP 347: Включить функции языка C++14

Этот JEP позволяет использовать [функции C++14]((https://en.wikipedia.org/wiki/C%2B%2B14 ) для использования в исходном коде C++ в JDK.

Дальнейшее Чтение

3. JEP 357: Переход с Mercurial на Git

Этот JEP переносит исходный код OpenJDK с Mercurial на Git или GitHub, относится к приведенному ниже JEP 369

Причины перехода на Git:

  1. Размер файла метаданных системы управления версиями (Mercurial) слишком велик.
  2. Доступный инструмент
  3. Доступный хостинг

Дальнейшее Чтение

4. JEP 369: Переход на GitHub

Этот JEEP присоединяется к вышеупомянутому JEP 357 , переносит исходный код OpenJDK из Mercurial в GitHub .

Дальнейшее Чтение

5. JEP 376: ZGC: Параллельная обработка стека потоков

Этот JEEP улучшает сборщик мусора Z (GC), перемещая обработку стека потоков GC из безопасных точек в параллельную фазу.

История

  • Java 11 JEP 333 представила сборщик мусора Z (GC) в качестве экспериментального сборщика мусора.
  • Java 15 JEP 377 , ZGC стал особенностью продукта.

Дальнейшее Чтение

6. JEP 380: Каналы сокетов Unix-Домена

Сокеты Unix-домена используются для межпроцессной связи (IPC) на одном хосте, что означает обмен данными между процессами, выполняемыми на одном хосте. Сокеты Unix-домена похожи на сокеты TCP/IP, за исключением того, что они адресуются по именам путей файловой системы, а не по адресам Интернет-протокола (IP) и номерам портов. Большинство платформ Unix, Windows 10 и Windows Server 2019, также поддерживали сокеты Unix-домена.

Этот JEP добавляет сокет Unix-домена (AF_UNIX) поддержку существующего Сокет-канал и серверный канал .

Новые классы сокетов или API для домена Unix:

  • Новый класс адреса сокета, java.net . Адрес сокета доменов Unix
  • Новый перечисление , java.net . Стандартное семейство. UNIX-система

Дальнейшее Чтение

7. JEP 386: Порт Alpine для Linux

Этот JEP переносит JDK в Alpine Linux и другие дистрибутивы Linux, использующие реализацию musl . Этот порт JDK позволяет Java работать “из коробки” в Alpine Linux, что выгодно для таких Java-зависимых платформ или инструментов, как Tomcat и Spring.

P.S Alpine Linux содержит изображения небольшого размера, широко используемые в облачных развертываниях, микросервисах и контейнерных средах.

Дальнейшее Чтение

8. JEP 387: Эластичное Метапространство

Java 8 JEP122 удалил PermGen (Постоянное поколение) и представил Metaspace , собственный менеджер памяти вне кучи в точке доступа.

Этот JEP улучшает управление памятью метапространства, возвращая неиспользуемые Класс Hotspot – метаданные или память метапространства в операционную систему быстрее, сокращая объем метапространства и упрощая код метапространства.

Дальнейшее Чтение

9. JEP 388: Порт Windows/AArch64

Этот JEP переносит JDK в Windows/AArch64 под управлением JDK+ Windows на оборудовании ARM, сервере или ноутбуке на базе ARM.

P.S Windows/AArch64 является популярным спросом на рынке конечных пользователей.

Дальнейшее Чтение

10. JEP 389: API внешнего компоновщика (Инкубатор)

Этот JEP позволяет Java-коду вызывать или может быть вызван машинным кодом, написанным на других языках, таких как C или C++, замените Собственный интерфейс Java (JNI)

P.S Это инкубационная функция; нужно добавить — добавить модули jdk.инкубатор.иностранный для компиляции и запуска кода Java.

10.1 В приведенном ниже примере показано, как использовать API-интерфейсы внешнего компоновщика для вызова стандартной библиотеки C strlen для возврата длины строки.

size_t strlen(const char *s);
import jdk.incubator.foreign.*;

import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodType;

import static jdk.incubator.foreign.CLinker.C_LONG;
import static jdk.incubator.foreign.CLinker.C_POINTER;

// Java call standard C library
// size_t strlen(const char *s);
public class CStrLen {

  public static void main(String[] args) throws Throwable {

      if (args.length == 0) {
          throw new IllegalArgumentException("Please provide an argument.");
      }

      String input = args[0];

      MethodHandle strlen = CLinker.getInstance().downcallHandle(
              LibraryLookup.ofDefault().lookup("strlen").get(),
              MethodType.methodType(long.class, MemoryAddress.class),
              FunctionDescriptor.of(C_LONG, C_POINTER)
      );

      try (MemorySegment str = CLinker.toCString(input)) {
          long len = (long) strlen.invokeExact(str.address()); // 5
          System.out.println(len);
      }

  }
}

Компиляция с включенными модулями инкубатора.

$ javac --add-modules jdk.incubator.foreign CStrLen.java

warning: using incubating module(s): jdk.incubator.foreign
1 warning

Запуск с включенными модулями инкубатора.

$ java --add-modules jdk.incubator.foreign -Dforeign.restricted=permit CStrLen mkyong

WARNING: Using incubator modules: jdk.incubator.foreign
6

10.2 Ниже приведен еще один пример вызова функции, определенной в коде на языке Си.

Простая функция C для печати hello world.

#include 

void printHello() {
        printf("hello world!\n");
}

Скомпилируйте приведенный выше код C и выведите его в общую библиотеку hello.so .

$ gcc -c -fPIC hello.c
$ gcc -shared -o hello.so hello.o

Под программой Java найдите hello.so и вызовите его метод напечатать Привет .

import jdk.incubator.foreign.CLinker;
import jdk.incubator.foreign.FunctionDescriptor;
import jdk.incubator.foreign.LibraryLookup;

import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodType;
import java.nio.file.Path;
import java.util.Optional;

public class JEP389 {

  public static void main(String[] args) throws Throwable {

      Path path = Path.of("/home/mkyong/projects/core-java/java-16/hello.so");

      LibraryLookup libraryLookup = LibraryLookup.ofPath(path);

      Optional optionalSymbol = libraryLookup.lookup("printHello");
      if (optionalSymbol.isPresent()) {

          LibraryLookup.Symbol symbol = optionalSymbol.get();

          FunctionDescriptor functionDescriptor = FunctionDescriptor.ofVoid();

          MethodType methodType = MethodType.methodType(Void.TYPE);

          MethodHandle methodHandle = CLinker.getInstance().downcallHandle(
                  symbol.address(),
                  methodType,
                  functionDescriptor);
          methodHandle.invokeExact();

      }

  }
}

Компилировать.

$ javac --add-modules jdk.incubator.foreign JEP389.java

warning: using incubating module(s): jdk.incubator.foreign
1 warning

Бежать.

$ java --add-modules jdk.incubator.foreign -Dforeign.restricted=permit JEP389

WARNING: Using incubator modules: jdk.incubator.foreign
hello world!

История

  • Java 14 JEP 370 представил API доступа к внешней памяти (Инкубатор).
  • Java 15 JEP 383 представил API доступа к внешней памяти (Второй инкубатор).
  • Java 16 JEP 389 представил API внешнего компоновщика (Инкубатор).
  • Java 16 JEP 393 представил API доступа к внешней памяти (Третий инкубатор).
  • Java 17 JEP 412 представил API внешних функций и памяти (Инкубатор).

Дальнейшее Чтение

11. JEP 390: Предупреждения для классов, основанных на значениях

Этот JEP предоставляет новое предупреждение, если мы синхронизируем экземпляры классов на основе значений ; Также не рекомендуется удалять конструкторы класса-оболочки примитивов (на основе значений) для удаления.

11.1 Как определить классы, основанные на ценности? Аннотация @jdk.internal. Основанный на значениях указывает, является ли класс классом, основанным на значениях. Просмотрите следующие два класса, и мы можем сказать, что оба класса – примитивные оболочки Двойной и Необязательно являются классами, основанными на значениях.

package java.util;

@jdk.internal.ValueBased
public final class Optional {
  //...
}
package java.lang;

@jdk.internal.ValueBased
public final class Double extends Number
        implements Comparable, Constable, ConstantDesc {

  //...
}

Примечание Ссылаться JEP 390: Предупреждения для классов, основанных на значениях для полного списка классов, основанных на значениях.

11.2 Ниже приведен пример попытки синхронизировать класс, основанный на значениях.

public class JEP390 {

    public static void main(String[] args) {

        Double d = 20.0;
        synchronized (d) {} // javac warning & HotSpot warning
    }
}

Скомпилируйте приведенный выше код и получите новое предупреждение.

$ javac JEP390.java
JEP390.java:7: warning: [synchronization] attempt to synchronize on an instance of a value-based class
        synchronized (d) {} // javac warning & HotSpot warning
        ^
1 warning

11.3 Java 9 устарела для конструкторов класса-оболочки примитивов (на основе значений) и теперь помечена для удаления.

package java.lang;

//...

@jdk.internal.ValueBased
public final class Double extends Number
        implements Comparable, Constable, ConstantDesc {

  @Deprecated(since="9", forRemoval = true)
  public Double(double value) {
      this.value = value;
  }

  @Deprecated(since="9", forRemoval = true)
  public Double(String s) throws NumberFormatException {
      value = parseDouble(s);
  }

  //...
}

Дальнейшее Чтение

Речь идет о типах значений в будущем выпуске?

12. JEP 392: Упаковочный инструмент

ДЖИП переместил инструмент jpackage из jdk.incubator.package в jdk.package и стал стандартом или функцией продукта в Java 16. Этот пакет представляет собой упаковочный инструмент для упаковки Java-приложения в пакет для конкретной платформы, такой как:

  • Linux: deb и обороты в минуту
  • macOS: pkg и dmg
  • Windows: msi и exe-файлы

История

  • Java 14 JEP 343 представила инструмент инкубации jpackage , и он остался инструментом инкубации в Java 15.

12.1 В приведенном ниже примере показано использование пакета для упаковки простой программы Java Swing в формат deb в системе Linux (Ubuntu).

Простая программа Java Swing для отображения приветственного мира.

import javax.swing.*;
import java.awt.*;

public class JEP392 {

    public static void main(String[] args) {

        JFrame frame = new JFrame("Hello World Java Swing");
        // display frame site
        frame.setMinimumSize(new Dimension(800, 600));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // center the JLabel
        JLabel lblText = new JLabel("Hello World!", SwingConstants.CENTER);
        // add JLabel to JFrame
        frame.getContentPane().add(lblText);

        // display it
        frame.pack();
        frame.setVisible(true);

    }
}

Создайте файл jar и пакет в пакет для конкретной платформы; поскольку это тестируется в системе Ubuntu, он создаст файл .deb .

# compile
$ javac JEP392.java

# create a jar file
$ jar cvf hello.jar JEP392.class

# package the jar file into platform-specific package
$ /opt/jdk-16/bin/jpackage -i . -n JEP392 --main-jar hello.jar --main-class JEP392

# The jpackage created this jep392_1.0-1_amd64.deb
$ ls -lsah
4.0K -rw-rw-r--  1 mkyong mkyong  994 Mac  15 13:52 hello.jar
 30M -rw-r--r--  1 mkyong mkyong  30M Mac  15 14:01 jep392_1.0-1_amd64.deb

Установите файл .deb ;

sudo dpkg -i jep392_1.0-1_amd64.deb
Selecting previously unselected package jep392.
(Reading database ... 225576 files and directories currently installed.)
Preparing to unpack jep392_1.0-1_amd64.deb ...
Unpacking jep392 (1.0-1) ...
Setting up jep392 (1.0-1) ...

$ ls -lsah /opt/jep392/bin/JEP392
1.6M -rwxr-xr-x 1 root root 1.6M Mac  15 14:01 /opt/jep392/bin/JEP392

Каталог установки по умолчанию на

  • Linux – это /выбор
  • mac OS – это /Приложения
  • Windows – это C:\Program Файлы\

P.S Это может быть отменено с помощью jpackage –установить-реж. вариант.

Запустите установленную программу Java Swing.

$ /opt/jep392/bin/JEP392

Выход

пакет -h всегда твой лучший друг:

$ /opt/jdk-16/bin/jpackage -h
Usage: jpackage 

Sample usages:
--------------
  Generate an application package suitable for the host system:
      For a modular application:
          jpackage -n name -p modulePath -m moduleName/className
      For a non-modular application:
          jpackage -i inputDir -n name \
              --main-class className --main-jar myJar.jar
      From a pre-built application image:
          jpackage -n name --app-image appImageDir
  Generate an application image:
      For a modular application:
          jpackage --type app-image -n name -p modulePath \
              -m moduleName/className
      For a non-modular application:
          jpackage --type app-image -i inputDir -n name \
              --main-class className --main-jar myJar.jar
      To provide your own options to jlink, run jlink separately:
          jlink --output appRuntimeImage -p modulePath -m moduleName \
              --no-header-files [...]
          jpackage --type app-image -n name \
              -m moduleName/className --runtime-image appRuntimeImage
  Generate a Java runtime package:
      jpackage -n name --runtime-image 

  //...

Дальнейшее Чтение

13. JEP 393: API доступа к внешней памяти (Третий инкубатор)

API-интерфейсы доступа к внешней памяти позволяют Java API получать доступ к внешней памяти за пределами кучи Java, такой как memcached , Lucene и т.д.

Этот JEP обновил API-интерфейсы доступа к внешней памяти и остался в качестве модуля инкубатора .

История

  • Java 14 JEP 370 представил API доступа к внешней памяти (Инкубатор).
  • Java 15 JEP 383 представил API доступа к внешней памяти (Второй инкубатор).
  • Java 16 JEP 389 представил API внешнего компоновщика (Инкубатор).
  • Java 16 JEP 393 представил API доступа к внешней памяти (Третий инкубатор).
  • Java 17 JEP 412 представил API внешних функций и памяти (Инкубатор).

Дальнейшее Чтение

14. JEP 394: Сопоставление с образцом, например

Сопоставление шаблонов для экземпляра является стандартной функцией или функцией продукта в Java 16.

Перед сопоставлением с шаблоном мы проверяем тип объекта и приводим его к переменной вручную.

if (obj instanceof String) {
    String s = (String) obj;    // cast
}

Теперь мы можем проверить тип объекта и привести его автоматически

if (obj instanceof String s) {
    //... s is a string
}

Например, ниже приведен общий пример проверки и приведения.

  if (obj instanceof String) {
      String s = (String) obj;
      if (s.length() > 5) {
          if (s.equalsIgnoreCase("java16")) {
              //...
          }
      }
  }

И мы можем реорганизовать приведенный выше код, используя новый экземпляр .

  if (obj instanceof String s && s.length() > 5) {
      if (s.equalsIgnoreCase("java16")) {
          //...
      }
  }

История

  • Java 14 JEP 305 , первый предварительный просмотр.
  • Java 15 JEP 375 , второй предварительный просмотр.
  • Java 16, стандартная функция.

Дальнейшее Чтение

15. ДЖИП 395: Записи

Запись завершена и становится стандартной функцией.

package com.mkyong.java16.jep395;

public class JEP395 {

    record Point(int x, int y) { }

    public static void main(String[] args) {

        Point p1 = new Point(10, 20);
        System.out.println(p1.x());         // 10
        System.out.println(p1.y());         // 20

        Point p2 = new Point(11, 22);
        System.out.println(p2.x());         // 11
        System.out.println(p2.y());         // 22

        Point p3 = new Point(10, 20);
        System.out.println(p3.x());         // 10
        System.out.println(p3.y());         // 20

        System.out.println(p1.hashCode());  // 330
        System.out.println(p2.hashCode());  // 363
        System.out.println(p3.hashCode());  // 330

        System.out.println(p1.equals(p2));  // false
        System.out.println(p1.equals(p3));  // true
        System.out.println(p2.equals(p3));  // false

    }
}

История

  • Java 14 JEP 359 , первый предварительный просмотр.
  • Java 15 JEP 384 , второй предварительный просмотр.
  • Java 16, стандартная функция.

Дальнейшее Чтение

16. JEEP 396: По умолчанию сильно инкапсулируйте внутренние компоненты JDK

Java 9 JEP 261 представила опцию --незаконный доступ для управления доступом к внутренним API и пакетам JDK.

Этот JEP изменяет режим по умолчанию для параметра --незаконный доступ с разрешения на запрет. С этим изменением внутренние пакеты и API (за исключением критических внутренних API ) JDK больше не будут открываться по умолчанию.

Мотивация этого JEP состоит в том, чтобы препятствовать сторонним библиотекам, фреймворкам и инструментам использовать внутренние API и пакеты JDK.

Дальнейшее Чтение

17. JEP 397: Закрытые классы (Второй предварительный просмотр)

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

Дальнейшее Чтение

P.S Этот запечатанный класс является стандартной функцией в Ява 17 .

Скачать Исходный Код

$клон git $клон git

$cd java-16

Рекомендации

Оригинал: “https://mkyong.com/java/what-is-new-in-java-16/”