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

Что нового в Java 14

Функции Java 14 – Выражение переключения (стандартное), записи (предварительный просмотр), сопоставление с образцом (предварительный просмотр), текстовые блоки или многострочные (второй предварительный просмотр), API доступа к внешней памяти (инкубатор)

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

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

Функции Java 14.

  • 1. JEP 305: Сопоставление с образцом, например (Предварительный просмотр)
  • 2. ДЖИП 343: Упаковочный инструмент (Инкубатор)
  • 3. JEP 345: Выделение памяти с поддержкой NUMA для G1
  • 4. JEP 349: Потоковая передача событий JFR
  • 5. JEP 352: Энергонезависимый отображаемый буфер
  • 6. JEP 358: Полезное исключение Nullpointerexception
  • 7. JEP 359: Записи (Предварительный просмотр)
  • 8. JEP 361: Выражения переключения (стандартные)
  • 9. JEP 362: Осуждать Solaris и SPARC Порты
  • 10. JEP 363: Удалите Параллельную развертку метки (CMS) Сборщик Мусора
  • 11. JEP 364: ZGC на macOS (экспериментальный)
  • 12. JEP 365: ZGC в Windows (экспериментальный)
  • 13. JEP 366: Не рекомендуется использовать комбинацию ParallelScavenge + serialold GC
  • 14. JEP 367: Удалите инструменты Pack200 и API
  • 15. JEP 368: Текстовые блоки (Второй предварительный просмотр)
  • 16. JEP 370: API доступа к внешней памяти (Инкубатор)

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

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

1. JEP 305: Сопоставление с образцом, например (Предварительный просмотр)

До Java 14 мы использовали instanceof-и-приведение для проверки типа объекта и приведения к переменной.

  if (obj instanceof String) {        // instanceof
    String s = (String) obj;          // cast
    if("jdk14".equalsIgnoreCase(s)){
        //...
    }
  }else {
	   System.out.println("not a string");
  }

Теперь Java 14, мы можем реорганизовать приведенный выше код следующим образом:

  if (obj instanceof String s) {      // instanceof, cast and bind variable in one line.
      if("jdk4".equalsIgnoreCase(s)){
          //...
      }
  }else {
	   System.out.println("not a string");
  }

если obj является экземпляром String , затем он преобразуется в String и присваивается переменной привязки s .

История Это сопоставление с шаблоном является стандартной функцией в Java 16, JEP 394 .

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

2. ДЖИП 343: Упаковочный инструмент (Инкубатор)

Новый пакет инструмент для упаковки Java-приложения в пакет для конкретной платформы, например:

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

P.S Этот инструмент упаковки является стандартной функцией в Java 16, посетите этот пример пакета .

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

3. JEP 345: Выделение памяти с поддержкой NUMA для G1

Новый Режим выделения памяти с поддержкой NUMA повышает производительность G1 на больших машинах. Добавьте +XX:+usenuma опцию, чтобы включить ее.

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

4. JEP 349: Потоковая передача событий JFR

Улучшено существующее ПРЕДЛОЖЕНИЕ для поддержки потоковой передачи событий, это означает, что теперь мы можем транслировать события JFR в режиме реального времени, без необходимости сбрасывать записанные события на диск и анализировать их вручную.

Регистратор полетов JDK (JFR) – это инструмент для сбора диагностических и профилирующих данных о запущенном приложении Java. Обычно мы запускаем запись, останавливаем ее, сбрасываем записанные события на диск для анализа, это хорошо работает для профилирования, анализа или отладки.

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

5. JEP 352: Энергонезависимый отображаемый буфер

Улучшен Файловый канал API для создания MappedByteBuffer для доступа к энергонезависимой памяти (NVM) – память, которая может извлекать сохраненные данные даже после включения питания. Например, эта функция гарантирует, что любые изменения, которые все еще могут находиться в кэше, будут записаны обратно в память.

P.S Только ОС Linux/x64 и Linux/AArch64 поддерживают это!

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

6. JEP 358: Полезное исключение Nullpointerexception

Улучшено описание NullPointerExceptions , указав, какая переменная была нулевой. Добавить -XX:+Показывать Детали Кода В Сообщениях Об Исключениях опция для включения этой функции.

Простой файл Java, который вызывает исключение NullPointerException .

import java.util.Locale;

public class Test {

    public static void main(String[] args) {

        String input = null;
        String result = showUpperCase(input); // NullPointerException
        System.out.println(result);

    }

    public static String showUpperCase(String str){
        return str.toUpperCase(Locale.US);
    }

}

До Java 14.

$ /usr/lib/jvm/jdk-14/bin/java Test

Exception in thread "main" java.lang.NullPointerException
	at Test.showUpperCase(Test.java:15)
	at Test.main(Test.java:9)

Java 14 с -XX:+Показывать Сведения О Коде В Сообщениях Об Исключениях опция.

$ /usr/lib/jvm/jdk-14/bin/java -XX:+ShowCodeDetailsInExceptionMessages Test

Exception in thread "main" java.lang.NullPointerException:
  Cannot invoke "String.toUpperCase(java.util.Locale)" because "" is null
	at Test.showUpperCase(Test.java:15)
	at Test.main(Test.java:9)

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

7. JEP 359: Записи (Предварительный просмотр)

Новый класс называется запись (он же класс данных), это конечный класс, а не абстрактный, и все его поля также являются окончательными. запись автоматически сгенерирует утомительные конструкторы , public get , equals() , Хэш-код () , toString() во время компиляции.

P.S Никаких сеттеров, все поля являются окончательными.

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

record Point(int x, int y) { }
public class Test {

    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

    }

}

Протестируйте его с помощью --enable-предварительный просмотр .

$ /usr/lib/jvm/jdk-14/bin/javac --enable-preview --release 14 Point.java
$ /usr/lib/jvm/jdk-14/bin/javac --enable-preview --release 14 Test.java

$ /usr/lib/jvm/jdk-14/bin/java --enable-preview Test

Выход

10
20
11
22
10
20
330
363
330
false
true
false

История

  • Java 15 JEP 384 имеет второй предварительный просмотр записей с новыми функциями, такими как запечатанные типы, локальные записи, аннотации к записям и API отражения.
  • Java 16 JEP 395 , запись или класс данных является стандартной функцией.

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

8. JEP 361: Выражения переключения (стандартные)

Выражение switch было функцией предварительного просмотра в Java 12 и Java 13; теперь это официально стандартная функция JDK, это означает, что начиная с Java 14 и далее мы можем возвращать значение с помощью выражений switch без указания параметра --enable-preview .

Смотрите краткое описание; мы можем использовать yield для возврата значения из переключателя .

	private static int getValueViaYield(String mode) {
        int result = switch (mode) {
            case "a", "b":
                yield 1;
            case "c":
                yield 2;
            case "d", "e", "f":
								// do something here...
							 	System.out.println("Supports multi line block!");
                yield 3;
            default:
                yield -1;
        };
        return result;
    }

Или с помощью ярлыка правил или стрелок.

	private static int getValueViaArrow(String mode) {
        int result = switch (mode) {
            case "a", "b" -> 1;
            case "c" -> 2;
            case "d", "e", "f" -> {
                // do something here...
                System.out.println("Supports multi line block!");
                yield 3;
            }
            default -> -1;
        };
        return result;
    }

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

9. JEP 362: Осуждать Solaris и SPARC Порты

Отказ от поддержки портов Solaris/SPARC, Solaris/x64 и Linux/SPARC, меньшее количество поддерживаемых платформ означает более быструю доставку новых функций.

P.S Java 15 JEP 381 удалены вышеуказанные порты.

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

10. JEP 363: Удалите Параллельную развертку метки (CMS) Сборщик Мусора

Java 9 JEP 291 устарела эта одновременная проверка меток (CMS) Сборщик мусора, и теперь он официально удален.

/usr/lib/jvm/jdk-14/bin/java -XX:+UseConcMarkSweepGC Test

OpenJDK 64-Bit Server VM warning: Ignoring option UseConcMarkSweepGC; support was removed in 14.0

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

11. JEP 364: ZGC на macOS (экспериментальный)

Java 11 JEEP 333 представила сборщик мусора Z (GC) в Linux, и теперь он переносится на macOS.

P.S Этот ZGC является функцией продукта в Java 15 JEP 377 .

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

12. JEP 365: ZGC в Windows (экспериментальный)

Java 11 JPG 333 представила сборщик мусора Z (GC) в Linux, и теперь он переносится на версию Windows.

P.S Этот ZGC является функцией продукта в Java 15 JEP 377 .

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

13. JEP 366: Не рекомендуется использовать комбинацию ParallelScavenge + serialold GC

Из-за меньшего использования и больших затрат на техническое обслуживание Java 14 отвергает комбинацию параллельных алгоритмов GC молодого поколения и последовательных алгоритмов GC старого поколения.

/usr/lib/jvm/jdk-14/bin/java -XX:-UseParallelOldGC Test

OpenJDK 64-Bit Server VM warning: Option UseParallelOldGC was deprecated in version 14.0 and will likely be removed in a future release.

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

14. JEP 367: Удалите инструменты Pack200 и API

Java 11 JEP 336 устарел пакет200 и распаковать 200 инструменты, и Pack200 API в java.util.jar пакет, и теперь он официально удален.

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

15. JEP 368: Текстовые блоки (Второй предварительный просмотр)

Первый предварительный просмотр появился в Java 13 JEP 354 , теперь добавлены еще две новые escape-последовательности:

  • \<конец строки> подавляет завершение строки.
  • \s переводится в один пробел.
public class Test {

    public static void main(String[] args) {

        String html = "\n" +
                      "   \n" +
                      "      

Hello, World

\n" + " \n" + "\n"; String java13 = """

Hello, World

"""; String java14 = """ \

Hello, '\s' World

\ """; System.out.println(html); System.out.println(java13); System.out.println(java14); } }
$ /usr/lib/jvm/jdk-14/bin/javac --enable-preview --release 14 Test.java
$ /usr/lib/jvm/jdk-14/bin/java --enable-preview Test

Выход

html>
   
      

Hello, World

Hello, World

Hello, ' ' World

P.S Эти текстовые блоки являются постоянной функцией в Java 15.

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

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

Модуль инкубатора , позволяющий Java API получать доступ к внешней памяти за пределами кучи Java.

import jdk.incubator.foreign.*;
import java.lang.invoke.VarHandle;
import java.nio.ByteOrder;

public class Test {

    public static void main(String[] args) {

	     VarHandle intHandle = MemoryHandles.varHandle(
            int.class, ByteOrder.nativeOrder());

        try (MemorySegment segment = MemorySegment.allocateNative(1024)) {

            MemoryAddress base = segment.baseAddress();

            // print memory address
            System.out.println(base);                 

            // set value 999 into the foreign memory
	          intHandle.set(base, 999);                 

            // get the value from foreign memory
            System.out.println(intHandle.get(base));  

        }

    }

}

Скомпилируйте и запустите с помощью модуля инкубатора jdk.incubator.foreign .

$ /usr/lib/jvm/jdk-14/bin/javac --add-modules jdk.incubator.foreign Test.java

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

$ /usr/lib/jvm/jdk-14/bin/java --add-modules jdk.incubator.foreign Test

WARNING: Using incubator modules: jdk.incubator.foreign
MemoryAddress{ region: MemorySegment{ id=0x4aac6dca limit: 1024 } offset=0x0 }
999

История

  • В Java 15 JEP 383 есть второй инкубатор.
  • В Java 16 JEP 393 есть третий инкубатор.

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

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

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

$компакт-диск java-14

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

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