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

Добавить комментарий

Sidebar