Что нового в 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!