Автор оригинала: 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/”