Что нового в Java 14

Я уже успел написать учебник по Java 8, а также описать нововведения в Java 9, 10, 11, 12 и 13. Настал черёд, мои друзья, поговорить о том, что нового у нас появилось 17 марта (Месяц Первого зерна) 2020 года с появлением Java 14.

Если вам нужно самое исчерпывающее описание всех новых возможностей, то лучше обратитесь к оригиналу на английском. Здесь же я попробую сконцентрироваться только на нескольких нововведениях, которые мне показались наиболее важными.

Все исходные коды проверялись с помощью JShell, который появился в Java версии 9.

Pattern matching for instanceof

Это только preview-фича, то есть вполне возможно, что в будущих версиях её уберут, а в текущей 14 версии Java её можно включить с помощью опции --enable-preview:

То есть внутри instanceof мы уже объявляем переменную myDate нужного типа. Довольно полезно, так как после instanceof почти всегда идёт приведение к типу и присваивание переменной этого типа. До этой фичи это выглядело бы так:

Я думаю, что такую фичу оставят, довольно разумно выглядит, хотя это и чистый синтаксический сахар. Но это не точно.

Эту возможность можно даже вот так использовать:

Полезные NullPointerException-ы

До Java 14 исключения NullPointerException возвращало мало информации, поэтому находить источник проблемы было довольно сложно.

Например:

Как видим, нам просто указывается NullPointerException с указанием позиции. В Java 14 можно получить более подробную информацию о том, какое именно выражение вернуло непредвиденный null. Однако по умолчанию такие детализированные сообщения отключены. Их можно включить с помощью опции -XX:+ShowCodeDetailsInExceptionMessages, но для этого нам придётся перезапустить JShell, поэтому сначала сохраним выполненные команды в файл, а затем после перезапуска загрузим их:

Обратите внимание:

  • Мы передали опцию -XX:+ShowCodeDetailsInExceptionMessages через флаг -R, так как нужно его передать именно исполняемой среде, а не самому JShell.
  • В сообщении об ошибке мы видим, что REPL.$JShell$12$B.getC() вернуло null, то есть getB() вернуло B, а getC() уже вернуло null.

Switch Expressions

Я уже описывал это изменение про switch expressions, поэтому ещё раз писать не буду, но стоит акцентрировать внимание на том, что в Java 14 они стали частью стандарта.

Имейте ввиду, что yield и var запрещено использовать в качестве имени класса, но они НЕ являются зарезервированными ключевыми словами.

Текстовые блоки

Так же, как и в прошлый раз, они только как preview. Пример текстового блока:

В результате переменная html1 будет содержать следующее:

Причём в текстовых блоках переводы строк нормализуются в LF (под стиль Unix).

Обратите внимание, что часть начальных пробелов в конечную строку не попала. А именно, не попала та часть пробелов, которая здесь визуализирована в виде точек:

То есть был убраны пробелы в каждой строке по количеству пробелов перед завершающим """. Подобное поведение с убранными пробелами позволяет вплетать текстовые блоки в окружающий код, не ломая общую структуру.

Символы кавычек в текстовых блоках можно использовать без ограничений, но если мы хотим использовать три машинописные кавычки подряд, то их нужно предварять одной косой чертой:

В результате text1 будет содержать следующее:

Все \r, \n, \b и аналогичные, которые работали в строках, в текстовых блоках работают.

Также появились новые специальные последовательности. Например, \s переводится в обычный пробел, что можно использовать для выравнивания пробелами строк до определенной длины:

Если нам нужно создать длинную строковую константу, то мы можем использовать символ \ в конце каждой строки, чтобы отменить перевод на новую строку в результирующем значении.

Пример:

Приведённый выше код аналогичен следующему:

Имейте в виду, что текстовые блоки всё ещё только в качестве preview, чтобы ими воспользоваться, нужно использовать флаг --enable-preview.

Удалён Concurrent Mark Sweep Garbage Collector

Сборщик мусора CMS (Concurrent Mark Sweep) удалён в Java 14. Светлая память ему. Но я, честно говоря, даже не помню про него ничего.

Records (записи)

Опять же только в качестве preview.

Записи предполагается использовать для облегчения создания классов, которые имеют состояние, но не имеют поведения. Пример:

Записи автоматически получают приватные переменные для хранения своего состояния, методы hashCode, equals, toString, работающие с переменными состояния, а также методы для получения значения каждой из переменной состояния.

Сами записи неявно final, их переменные состояния тоже final.

JPackage

Пока только как incubator, что, по всей видимости, означает, что он может быть удалён в последующих релизах.

Пример использования:

Упакует всё в формат pkg из каталога lib, а основной класс для запуска в lib/main.jar и описан в его MANIFEST.MF.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *