Что нового в JAVA 19
На официальном сайте Java есть полный список изменений, и он на английском языке. В этой статье мы приведем обзор только самых важных нововведений, их краткую выдержку и покажем примеры.
Основные новые функции
- Виртуальные потоки (Preview) JEP 425
В текущей версии все еще остается в статусе предварительного API и отключен по умолчанию.
Виртуальные потоки (Virtual Threads) — это облегченные потоки, которые значительно упрощают многопоточную разработку с высокой пропускной способностью.
Стандартные потоки — это оболочки над потоками ОС. Их использование обходится дорого. По этой причине их количество ограничено.
В свою очередь, виртуальные потоки легковесны и могут создаваться в огромном количестве. Это свойство позволяет применять подход «поток на запрос», увеличивая масштабируемость, не прибегая к асинхронному программированию. Виртуальный поток использует поток ОС только во время выполнения вычислений на ЦП, так как виртуальный поток существует только внутри JVM. Локальные переменные потока носителя недоступны для виртуального потока, и наоборот.
Оба вида потока являются экземплярами java.lang.Thread. Это значит, что переход на виртуальные потоки не требует большого болезненного рефакторинга старого кода с использованием только платформенных потоков. Разработчики сами могут выбирать какой вид потока использовать. Например, для создания виртуального потока для каждой задачи используетсяExecutors.newVirtualThreadPerTaskExecutor()
. - Паттерн запись (Preview) JEP 405
Добавлен паттерн запись. С его помощью код становится лаконичнее.
Пример:
//Старый вариант:
record Pair(int x, int y) {}
static void printSum(Object o) {
if (o instanceof Pair p) {
System.out.println(p.x() + p.y());
}
}
//Новый вариант:
record Pair(int x, int y) {}
static void printSum(Object o) {
if (o instanceof Point(int x, int y)) {
System.out.println(x + y);
}
}
Также он поддерживает вложенные типы.
Пример:
record Fio(String firstName, String lastName) {}
record Tire(int width, int aspectRatio, int rim) {}
enum Color { BLACK, WHITE, YELLOW }
record Auto(Tire tire, Color color) {}
record Person(Fio fio, Auto auto) {}
static void printTireParametersOfPerson(Person person) {
if (person instanceof Person(Fio fio, Auto(Tire(int width, int aspectRatio, int rim) tire, Color color) auto)) {
String parameters = "Tire: " + width + "/" + aspectRatio + "R" + "rim";
System.out.println(parameters);
}
}
- Паттерн сопоставление для switch (Preview) JEP 427
Паттерн охранник изменен: было&&
, сталоwhen
.
Дляcase
можно использоватьnull
. Теперьnull
матчится только там и больше нигде. В остальных случаях будетNPE
. - API внешних функций и памяти (Preview) JEP 424
Данный JEP перешел в статус Preview в JDK 19. - Вектор API (Fourth Incubator) JEP 426
По-прежнему находится в инкубационном статусе.
Обновления
- Поддержка Юникода 14.0.
- Новые свойства системы для
System.out
иSystem.err
.
Добавлены два новых системных свойстваstdout.encoding
иstderr.encoding
. Значение этих системных свойств — это кодировка, используемая стандартным потоком вывода и стандартными потоками ошибок. - Поддержка привязки канала HTTPS для Java GSS/Kerberos.
- Дополнительные форматы даты и времени.
java.time.format.DateTimeFormatter и java.time.format.DateTimeFormatterBuilder
Теперь в классах представлены дополнительные форматы даты/времени. Теперь пользователи могут указать свой собственный гибкий стиль с помощью нового методаDateTimeFormatter.ofLocalizedPattern(String requestedTemplate)
. - Новые методы создания предварительно выделенных
HashMaps
иHashSet
.
Были введены новые статические фабричные методы, позволяющие создаватьHashMap
и связанные экземпляры, предварительно выделенные для размещения ожидаемого количества сопоставлений или элементов. После вызова методаHashMap.newHashMap
(дляLinkedHashMap
,WeakHashMap
,HashSet
иLinkedHashSet
существуют аналогичные методы) запрошенное количество сопоставлений может быть добавлено к вновь созданномуHashMap
без изменения его размера.
Устаревшее
- java.lang.ThreadGroup.
Поведение нескольких методов, удаление которых не рекомендовалось в предыдущих выпусках, изменено следующим образом:
Методdestroy
ничего не делает.
МетодisDestroyed
возвращает ложь.
МетодыsetDaemon
иisDaemon
устанавливают/получают статус демона, который ни для чего не используется.
Методыsuspend
,resume
иstop
бросаютUnsupportedOperationException
. - Прекращение поддержки конструкторов классов
Locale
.
Новые фабричные методыLocale.of()
заменяют устаревшие конструкторыLocale
.
Заключение
В Java 19 не появилось критически важных нововведений, из-за которых стоило бы переходить на эту версию. Будем ждать следующие обновления.
Comments
So empty here ... leave a comment!