Рубрики
Без рубрики

Новые функции в Java 14

Исследуйте различные JEP Java 14.

Автор оригинала: baeldung.

1. Обзор

Java 14 была выпущена 17 марта 2020 года, ровно через шесть месяцев после ее предыдущей версии в соответствии с новой версией Java.

В этом уроке мы рассмотрим краткое описание новых и устаревших функций версии 14 языка .

У нас также есть более подробные статьи по Java 14, которые предлагают углубленное представление о новых функциях.

2. Функции, Перенесенные Из Более Ранних Версий

Некоторые функции были перенесены в Java 14 из предыдущей версии. Давайте рассмотрим их один за другим.

2.1. Выражения переключения (JEP 361)

Они были впервые представлены в качестве функции предварительного просмотра в JDK 12, и даже в Java 13 они продолжали использоваться только в качестве функций предварительного просмотра. Но теперь выражения switch были стандартизированы таким образом, что они являются неотъемлемой частью комплекта разработки .

Это фактически означает, что теперь эта функция может использоваться в производственном коде, а не только в режиме предварительного просмотра, с которым разработчики могут экспериментировать.

В качестве простого примера давайте рассмотрим сценарий, в котором мы бы обозначили дни недели как будние или выходные.

До этого улучшения мы бы написали его как:

boolean isTodayHoliday;
switch (day) {
    case "MONDAY":
    case "TUESDAY":
    case "WEDNESDAY":
    case "THURSDAY":
    case "FRIDAY":
        isTodayHoliday = false;
        break;
    case "SATURDAY":
    case "SUNDAY":
        isTodayHoliday = true;
        break;
    default:
        throw new IllegalArgumentException("What's a " + day);
}

С помощью выражений switch мы можем написать то же самое более сжато:

boolean isTodayHoliday = switch (day) {
    case "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY" -> false;
    case "SATURDAY", "SUNDAY" -> true;
    default -> throw new IllegalArgumentException("What's a " + day);
};

2.2. Текстовые блоки (JEP 368)

Текстовые блоки продолжают свой путь к получению основного обновления и по-прежнему доступны в качестве функций предварительного просмотра.

В дополнение к возможностям JDK13, позволяющим упростить использование многострочных строк, во втором предварительном просмотре текстовые блоки теперь имеют две новые escape-последовательности :

  • \: для указания конца строки, чтобы не вводить новый символ строки
  • \s: для обозначения одного пробела

Например:

String multiline = "A quick brown fox jumps over a lazy dog; the lazy dog howls loudly.";

теперь можно записать как:

String multiline = """
    A quick brown fox jumps over a lazy dog; \
    the lazy dog howls loudly.""";

Это улучшает читаемость предложения для человеческого глаза, но не добавляет новую строку после dog; .

3. Новые функции предварительного просмотра

3.1. Сопоставление шаблонов, например (JEP 305)

JDK14 ввел сопоставление шаблонов, например, с целью устранения шаблонного кода и облегчения жизни разработчика.

Чтобы понять это, давайте рассмотрим простой пример.

Перед этой функцией мы писали:

if (obj instanceof String) {
    String str = (String) obj;
    int len = str.length();
    // ...
}

Теперь нам не нужно столько кода, чтобы начать использовать obj в качестве строки:

if (obj instanceof String str) {
    int len = str.length();
    // ...
}

В будущих выпусках Java будет придумывать сопоставление шаблонов для других конструкций, таких как switch .

3.2. Записи (JEP 359)

Записи были введены для уменьшения повторяющегося шаблонного кода в POJOS модели данных. Они упрощают повседневную разработку, повышают эффективность и значительно минимизируют риск человеческих ошибок .

Например, модель данных для Пользователя с идентификатором и паролем может быть просто определена как:

public record User(int id, String password) { };

Как мы видим, мы используем новое ключевое слово, запись, здесь . Это простое объявление автоматически добавит конструктор, геттеры, equals , hashCode и toString методы для нас.

Давайте посмотрим на это в действии с помощью JUnit:

private User user1 = new User(0, "UserOne");

@Test
public void givenRecord_whenObjInitialized_thenValuesCanBeFetchedWithGetters() {
    assertEquals(0, user1.id());
    assertEquals("UserOne", user1.password());
}

@Test
public void whenRecord_thenEqualsImplemented() {
    User user2 = user1;
    assertTrue(user1, user2);
}

@Test
public void whenRecord_thenToStringImplemented() {
    assertTrue(user1.toString().contains("UserOne"));
}

4. Новые Производственные Характеристики

Наряду с двумя новыми функциями предварительного просмотра Java 14 также поставила готовую к производству конкретную функцию.

4.1. Полезные NullPointerExceptions (JEP 358)

Ранее трассировка стека для исключения NullPointerException не имела большой истории, за исключением того, что некоторое значение было нулевым в данной строке в данном файле.

Хотя эта информация и полезна, она лишь предлагает строку для отладки, а не рисует всю картину для понимания разработчиком, просто взглянув на журнал.

Теперь Java упростила это , добавив возможность указать, что именно было null в данной строке кода .

Например, рассмотрим этот простой фрагмент:

int[] arr = null;
arr[0] = 1;

Ранее, при запуске этого кода, в журнале будет указано:

Exception in thread "main" java.lang.NullPointerException
at com.baeldung.MyClass.main(MyClass.java:27)

Но теперь, учитывая тот же сценарий, журнал может сказать:

java.lang.NullPointerException: Cannot store to int array because "a" is null

Как мы видим, теперь мы точно знаем, какая переменная вызвала исключение.

5. Особенности Инкубации

Это не окончательные API и инструменты, которые команда Java придумывает и предоставляет нам для экспериментов. Они отличаются от функций предварительного просмотра и предоставляются в виде отдельных модулей в пакете jdk.incubator .

5.1. API доступа к внешней памяти (JEP 370)

Это новый API, позволяющий программам Java безопасно и эффективно обращаться к внешней памяти, такой как собственная память, за пределами кучи.

Многие библиотеки Java, такие как map DB и memcached , имеют доступ к внешней памяти, и настало время, чтобы сам Java API предложил более чистое решение. С этим намерением команда придумала этот JEP в качестве альтернативы уже существующим способам доступа к памяти без кучи- ByteBuffer API и sun.misc.Unsafe API.

Построенный на трех основных абстракциях Сегмента памяти , Адреса памяти и Компоновки памяти , этот API является безопасным способом доступа как к кучной, так и к не кучной памяти.

5.2. Упаковочный инструмент (JEP 343)

Традиционно для доставки Java-кода разработчик приложения просто отправлял файл JAR, который пользователь должен был запустить в своей собственной JVM.

Однако пользователи скорее ожидали, что установщик, который они дважды щелкнут, установит пакет на их собственных платформах, таких как Windows или macOS.

Этот ДЖИП нацелен именно на это. Разработчики могут использовать jlink для сжатия JDK до минимально необходимых модулей, а затем использовать этот инструмент упаковки для создания облегченного образа, который можно установить как exe в Windows или dmg на macOS.

6. Функции JVM/HotSpot

6.1. ZGC в Windows (JEP 365) и macOS (JEP 364) – Экспериментальный

Сборщик мусора Z , масштабируемый сборщик мусора с низкой задержкой, был впервые представлен в Java 11 в качестве экспериментальной функции. Но изначально единственной поддерживаемой платформой была Linux/x64.

Получив положительные отзывы о ZGC для Linux, Java 14 также перенесла свою поддержку на Windows и macOS . Хотя это все еще экспериментальная функция, все готово к тому, чтобы стать готовым к производству в следующем выпуске JDK .

6.2. Распределение памяти с поддержкой NUMA для G1 (JEP 345)

Неравномерный доступ к памяти (NUMA) до сих пор не был реализован для сборщика мусора G1, в отличие от параллельного сборщика.

Глядя на повышение производительности, которое он предлагает для запуска одной JVM через несколько сокетов, этот ДЖИП был представлен, чтобы сделать коллектор G1 также осведомленным о NUMA .

На данный момент нет никакого плана реплицировать то же самое на другие сборщики горячих точек.

6.3. Потоковая передача событий JFR (JEP 349)

Благодаря этому усовершенствованию данные бортового самописца JDK теперь доступны для постоянного мониторинга. Это включает в себя изменения в пакете jdk.jfr.consumer , чтобы пользователи могли теперь читать или передавать данные записи напрямую.

7. Устаревшие или удаленные функции

Java 14 устарела из – за нескольких функций:

  • Порты Solaris и SPARC ( JEP 362 ) – потому что эта операционная система Unix и процессор RISC не находятся в активной разработке с последних нескольких лет
  • ParallelScavenge + SerialOld Комбинация GC ( JEP 366 ) – поскольку это редко используемая комбинация алгоритмов GC и требует значительных усилий по техническому обслуживанию

Есть также несколько удалений:

  • Параллельный сборщик мусора Mark Sweep (CMS) ( JEP 363 ) – устаревший в Java 9, этот GC был заменен G1 в качестве GC по умолчанию. Кроме того, в настоящее время существуют другие более эффективные альтернативы, такие как ZGC и Shenandoah, поэтому удаление
  • Инструменты Pack200 и API ( JEP 367 ) – они были устаревшими для удаления в Java 11, а теперь удалены

8. Заключение

В этом уроке мы рассмотрели различные JEP Java 14.

Всего в этом выпуске языка есть 16 основных функций , включая функции предварительного просмотра, инкубаторы, устаревания и удаления. Мы рассмотрели их все по очереди, а также особенности языка с примерами.

Как всегда, исходный код доступен на GitHub .