Автор оригинала: 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 , запись или класс данных является стандартной функцией.
Дальнейшее Чтение
- JEP 359: Записи (Предварительный просмотр)
- Класс данных записи Java 14
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; }
Дальнейшее Чтение
- JEP 361: Выражения переключения (Стандартные)
- Выражение переключения Java 13
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.
Дальнейшее Чтение
- JEP 368: Текстовые блоки (Второй предварительный просмотр)
- Многострочная строка Java, текстовые блоки
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
История
Дальнейшее Чтение
Скачать Исходный Код
$клон git $клон git
$компакт-диск java-14
Рекомендации
- Проект OpenJDK 14
- Java 14 поставляется с множеством новых функций
- История версий Java
- Википедия – Энергонезависимая память (NVM)
- Википедия – Неравномерный доступ к памяти (NUMA)
- Классы данных и запечатанные типы для Java
- Классы данных и запечатанные типы для Java
- Выражения переключения Java 13
- Текстовые блоки Java 13
Оригинал: “https://mkyong.com/java/what-is-new-in-java-14/”