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

Функции Java 14

Java 14 предоставляет множество функций для разработчиков, таких как записи, полезные сообщения об исключениях NullPointerException, улучшения instanceof и многие улучшения JVM.

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

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

Функции Java 14

Вот список функций Java 14:

  • Выражения переключения (стандартные) – JEP 361
  • Сопоставление шаблонов для instanceof (Предварительный просмотр) – JEP 305
  • Полезно NullPointerExceptions – JEP 358
  • Записи (Предварительный просмотр) – JEP 359
  • Текстовые блоки (Второй предварительный просмотр) – JEP 368
  • Упаковочный инструмент (инкубатор) – JEP 343
  • Распределение памяти с поддержкой NUMA для G1 – JEP 345
  • Потоковая передача событий JFR – JEP 349
  • Энергонезависимые буферы отображенных байтов – JEP 352
  • ZGC на macOS – JEP 364
  • ZGC в Windows – JEP 365
  • API доступа к внешней памяти (инкубатор) – JEP 370

Установка Java 14 Настройка на Mac OS

  • Чтобы начать работу с Java 14, загрузите JDK из здесь .
  • Скопируйте и извлеките файл tar в /Библиотеке/Java/JavaVirtualMachines , как показано ниже:
$ cd /Library/Java/JavaVirtualMachines

$ sudo cp ~/Downloads/openjdk-14_osx-x64_bin.tar.gz /Library/Java/JavaVirtualMachines

$ sudo tar xzf openjdk-14_osx-x64_bin.tar.gz

$ sudo rm openjdk-14_osx-x64_bin.tar.gz

Как только это будет сделано, откройте файл bash_profile с помощью любого текстового редактора. Я использую vim ~/.bash_profile . Установите путь Java14 к JAVA_HOME, сохраните изменения и выполните source ~/.bash_profile , чтобы отразить изменения.

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-14.jdk/Contents/Home

Наконец, вы готовы к компиляции и запуску программ с использованием Java 14. Мы будем использовать Shell , интерактивный инструмент командной строки REPL для быстрого тестирования новых функций Java 14.

Важно отметить, что многие функции, выпущенные в Java 14, находятся в предварительном просмотре. Это означает, что, хотя они полностью работают прямо сейчас, в будущем все может быть изменено. Некоторые из них могут быть сделаны стандартными или просто удалены в следующих циклах выпуска. Чтобы протестировать функции предварительного просмотра, вам необходимо явно установить --включить-предварительный просмотр при запуске оболочки или программы Java, как показано ниже:

jshell --enable-preview

javac --release 14 --enable-preview Author.java

В следующих нескольких разделах давайте обсудим некоторые особенности языка и JVM.

Рекомендуемое чтение : Установка Java 14 в Linux

1. Переключите Выражения

Выражения переключения после сохранения функции предварительного просмотра в двух последних выпусках –Java 12 и Java 13, наконец, получили постоянный статус в Java 14.

  • Java 12 ввела лямбда-синтаксис для выражений переключения, тем самым позволяя использовать несколько меток регистра для сопоставления с шаблоном, а также предотвращая ошибки, которые приводят к подробному коду. Он также применял исчерпывающие случаи, в которых ошибка компиляции возникала бы, если бы не были охвачены все входные случаи.
  • Java 13 , во втором предварительном просмотре были представлены операторы yield вместо break для возврата значений из выражения.

Java 14 наконец-то сделала эти функции стандартом.

String result = switch (day) {
            case "M", "W", "F" -> "MWF";
            case "T", "TH", "S" -> "TTS";
            default -> {
                if(day.isEmpty())
                    yield "Please insert a valid day.";
                else
                    yield "Looks like a Sunday.";
            }

        };
System.out.println(result);

Примечание : Yield не является новым ключевым словом в Java. Он просто используется в выражениях переключения.

2. Сопоставление шаблонов, например (Предварительный просмотр)

Попросите любого разработчика Java показать свою кодовую базу, и вы будете хорошо использовать instanceof условия во всем коде. В частности, за экземпляром условной проверки обычно следует типизация.

Java 14 избавляется от этой многословности, делая условное извлечение намного более кратким.

До Java 14:

if (obj instanceof Journaldev) {
  Journaldev jd = (Journaldev) obj;
  System.out.println(jd.getAuthor());
}

Java 14 И Далее:

if (obj instanceof Journaldev jd) {
  System.out.println(jd.getAuthor());
}

В приведенном выше коде экземпляр jd будет назначен только в том случае, если obj имеет тип Journaldev . Область действия переменной ограничена только условным блоком.

3. Полезное Исключение Nullpointerexception

Исключения с нулевыми указателями-это кошмар для любого разработчика. Ранее, до Java 13, было сложно отлаживать печально известные NPE. Разработчикам приходилось прибегать к другим инструментам отладки или вручную вычислять переменную/метод, который был равен нулю, поскольку трассировка стека показывала бы только номер строки.

До Java 14:

String name = jd.getBlog().getAuthor()

//Stacktrace
Exception in thread "main" java.lang.NullPointerException
    at NullPointerExample.main(NullPointerExample.java:5)

Java 14 представила новую функцию JVM, которая дает лучшее представление с более описательным стеком, как показано ниже:

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Blog.getAuthor()" because the return value of "Journaldev.getBlog()" is null
    at NullPointerExample.main(NullPointerExample.java:4)

Примечание : Вышеуказанная функция не является языковой функцией. Это усовершенствование в среде выполнения.

4. Записи (Предварительный просмотр)

Запись – это класс данных, в котором хранятся чистые данные. Идея введения записей состоит в том, чтобы быстро создавать простые и лаконичные классы, лишенные шаблонного кода.

Обычно класс в Java требует, чтобы вы реализовали equals () , Хэш-код () , методы getters и setters. Хотя некоторые IDE поддерживают автоматическое создание таких классов, код по-прежнему многословен. С помощью записи вам нужно просто определить класс следующим образом.

record Author(){}
//or
record Author (String name, String topic) {}

Компилятор Java автоматически создаст конструктор, закрытые конечные поля, методы доступа, равно /| Хэш-код и toString методы. Автоматически сгенерированными методами получения вышеуказанного класса являются name() и topic() .

Чтобы просмотреть сгенерированный код, используйте java Author после компиляции программы с помощью javac . На следующем рисунке показан сгенерированный класс для автора записи (имя строки, тема строки) {} :

Семантика записей аналогична классам данных в Котлине

Кроме того, мы можем добавить дополнительные поля, методы и конструктор в запись следующим образом:

record Author (int id, String name, String topic) {
    static int followers;

    public static String followerCount() {
        return "Followers are "+ followers;
    }

    public String description(){
        return "Author "+ name + " writes on "+ topic;
    }

    public Author{
    if (id < 0) {
        throw new IllegalArgumentException( "id must be greater than 0.");
     }
   }
}

Дополнительный конструктор, определенный внутри записи, называется Компактным конструктором. Он не состоит из каких-либо параметров и является просто расширением канонического конструктора.

Компактный конструктор не будет создаваться компилятором как отдельный конструктор. Вместо этого он используется для случаев проверки и будет вызываться в начале основного конструктора.

Несколько важных вещей, которые следует отметить в отношении записей:

  • Запись не может ни расширять класс, ни быть расширена другим классом. Это последний урок.
  • Записи не могут быть абстрактными
  • Записи не могут расширять какой-либо другой класс и не могут определять поля экземпляра внутри тела. Поля экземпляра должны быть определены только в описании состояния
  • Объявленные поля являются закрытыми и окончательными
  • Тело записи допускает статические поля и методы

Рекомендуемое чтение : Записи Java

4.1) Значения Внутри Ссылочных Полей Записи Могут Быть Изменены

Важно отметить, что для полей, определенных как объекты, неизменяема только ссылка. Базовые значения могут быть изменены. На следующем рисунке показана запись, в которой изменен список массивов. Как вы можете видеть, значение изменяется всякий раз, когда изменяется список массивов.

4.2) Записи Могут Реализовывать Интерфейсы

В следующем коде показан пример реализации интерфейса с записями:

record Author(String name, String topic) implements Information {
  public String getFullName() {
    return "Author "+ name + " writes on " + topic;
  }
}

interface Information {
  String getFullName();
}

Вот результат приведенного выше кода в действии в оболочке:

4.3) Записи поддерживают несколько конструкторов

Записи позволяют объявлять несколько конструкторов с параметрами или без них, как показано ниже:

record Author(String name, String topic) {
  public Author() {

    this("NA", "NA");
  }

  public Author(String name) {

    this(name, "NA");
  }
}

4.4) Записи Позволяют Изменять Методы Доступа

Хотя записи создают общедоступные методы доступа для полей, определенных в описании состояния, они также позволяют переопределить методы доступа в теле, как показано ниже:

record Author(String name, String topic) {
  public String name() {
        return "This article was written by " + this.name;
    }
}

4.5) Проверка записи и ее компонентов во время выполнения

Записи предоставляют нам компоненты is Record() и GetRecord () , чтобы проверить, является ли класс записью, а также изучить его поля и типы. На следующем рисунке показано, как это делается:

Хотя мы добавили дополнительные поля и методы в запись в приведенных выше примерах кода, убедитесь, что вы не переусердствовали с этим. Записи разработаны как простые носители данных, и если вы хотите реализовать множество дополнительных методов, лучше вернуться к обычному классу.

5. Текстовые блоки (Предварительный просмотр)

Текстовые блоки были введены в качестве функции предварительного просмотра в Java 13 с целью упрощения создания многострочных строковых литералов. Это полезно для простого создания строк запросов HTML и JSON или SQL.

В Java 14 текстовые блоки все еще находятся в предварительном просмотре с некоторыми новыми дополнениями. Теперь мы можем использовать:

  • Обратная косая черта для отображения красивых многострочных строковых блоков.
  • \s используется для учета конечных пробелов, которые по умолчанию игнорируются компилятором. Он сохраняет все пространства, присутствующие перед ним.
String text = """
                Did you know \
                Java 14 \
                has the most features among\
                all non-LTS versions so far\
                """;

String text2 = """
                line1
                line2 \s
                line3
                """;


String text3 = "line1\nline2 \nline3\n"

//text2 and text3 are equal.

Ссылки : OpenJDK 14