Java 14 is coming

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


Как сообщает компания Oracle, релиз Java 14 назначен на 17 марта. Интересно, связана ли дата релиза с Днем Святого Патрика (который отмечается как раз в этот день) или нет узнаем совсем скоро. Давайте посмотри на нововведения, которые будут доступны в новой джаве и решим, будем ли мы пить пиво от радости или от горя.


Records



Принципиально новая языковая фича, доступна в режиме превью в Java 14. Основная цель — избавиться от большого количества вермишели в коде. Records должны заменить классы, которые используются только для хранения данных в полях без какого-либо описанного поведения. Определим Record, а компилятор сам сгенерирует конструктор, геттеры, методы equals() и hashCode(), toString(). Где-то мы уже это видели, не так ли, господин Ломбок? Запись выглядит следующим образом:

public record Person(String name, int age){}


Для того чтобы скомпилировать Record необходимо загрузить jdk14 и ввести следующую команду:

javac —enable-preview —release 14 Person.java


Декомпилируем и посмотрим, что сделал компилятор:

public final class Person extends java.lang.Record {
    private final java.lang.String name;
    private final int age;

    public Person(java.lang.String name, int age) { /* compiled code */ }

    public java.lang.String toString() { /* compiled code */ }

    public final int hashCode() { /* compiled code */ }

    public final boolean equals(java.lang.Object o) { /* compiled code */ }

    public java.lang.String name() { /* compiled code */ }

    public int age() { /* compiled code */ }
}


Итак, вместо Record мы получили final class, который наследуется от нового, абстрактного класса Record. И как ожидалось, мы получили сгенерированные геттеры, конструктор, equals(), hashCode(), toString(). Обратим внимание на то, что все поля помечены как final, это значит, что мы не можем их переопределить, однако, сам Record не является полностью неизменяемым, т.к. объекты, которые хранятся в полях могут быть изменяемыми. Подробный разбор Record вы найдете здесь.

Разговорчивые NullPointerExceptions



Более дружелюбными станут NullPointerExceptions. Нет, компилятор все еще не умеет исправлять NPE за нас, но теперь описание исключения станет более информативным. Смоделируем ситуацию: вызовем NPE на Java 11 и Java 14. Например, у нас есть сложная композиция, типичная для Entity, и чтобы получить данные, нам нужно вызвать несколько объектов из исходного, чтобы добраться до нужного поля, и так:

var street = message.getAuthor().getAddress().getStreet();


На Java 11 мы получим старый привычный лог ошибки, который оставляет главный вопрос: Кто null? Message, Author, Address?

Exception in thread "main" java.lang.NullPointerException
	at Main.main(Main.java:11)


Чтобы запустить на Java 14, нужно скомпилировать класс так же, как и Record выше:

javac —enable-preview —release 14 Main.java


И выполнить, добавив специальный флаг:

java -XX:+ShowCodeDetailsInExceptionMessages --enable-preview Main


В результате выполнения мы получим следующий вывод:

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Address.getStreet()" because the return value of "Author.getAddress()" is null
	at Main.main(Main.java:11)


Как мы видим, сообщение стало более информативным, и мы можем видеть где именно в цепочке вызовов произошел NPE.

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



Текстовые блоки, появившиеся еще в Java 13, так же доступны в Java 14 как превью-фича. Напомню, что их основная задача — упростить работу с многострочными литералами. Очень удобная фича для написания SQL-запросов, HTML-кода, JSON. Думаю, что это одна из функций, которая станет очень полезной. Напомним синтаксис. Например, нам необходимо написать SQL-запрос. До Java 13, для написания запроса удобочитаемым мы бы использовали конкатенацию строк, и запрос выглядел бы примерно так:

String sql = "SELECT name, age " +
                 "FROM PERSON" +
                 "WHERE name = \'Igor\'" +
                 "AND car=\'Niva\'";


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


    String sql = """ 
                 SELECT name, age 
                 FROM PERSON
                 WHERE name = 'Igor'
                   AND car='Niva'
                 """;


В Java 14 добавлены два новых разделителя, которые можно использовать в текстовых блоках. Первый, это одиночный пробел: \s. Второй, это символ новой строки: \.

Switch Expressions



Начиная с Java 14, switch expressions переходит из превью-фичи в полноценную функцию. Напомним коротко особенности нового оператора:

  • Лямбда-синтаксис
  • Возможность использовать более одного выражения в case
  • Вывод ошибки в случае неполного покрытия множества возможных значений switch(). Другими словами, если вы используете перечисление:

    public enum  Car {
        NIVA, NEXIA, KIA
    }


    То если вы напишите switch() следующим образом, компилятор выдаст ошибку, которая говорит о том, что перечислены не все возможные случаи из перечисления:

    switch (car) {
        case NIVA -> System.out.println("Niva");
        case NEXIA -> System.out.println("Nexia");
    }
    // error: the switch expressions does not cover all possible input values.

  • Возможность возвращать значение:

    var avto = switch (car) {
        case NIVA, KIA -> "Niva are better";
        case NEXIA -> "Nexia";
        default -> "Niva still better";
    };



Pattern Matching



Pattern Matching новая превью-фича доступная в Java 14. О ней много говорили, её многие ждали и вот она здесь. Цель — объединить в операторе instanceof проверку типа объекта и его преобразование. Другими словами, до Java 14 мы бы писали так:

Object obj = "Igor";

if (obj instanceof String) {
    String s = (String) obj;
    System.out.println(s.length());
}


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

Object obj = "Igor";

if (obj instanceof String s){
    System.out.println(s.length());
}


Заключение



Java продолжает развиваться, упрощая жизнь простых смертных разработчиков. Новые функции призваны сделать код чище, жизнь проще, зарплаты выше. А как как думаете, какая из новых фич завоюет любовь сообщества?
Источник: https://habr.com/ru/post/491546/


Интересные статьи

Интересные статьи

Многие компании в определенный момент приходят к тому, что ряд процессов в бизнесе нужно автоматизировать, чтобы не потерять свое место под солнцем и своих заказчиков. Поэтому все...
Приветствую, дорогой читатель. Редко, но все же задачки из собеседований и обучалок имеют практическую ценность. Так, мне понадобилось реализовать на Java альтернативу арифметическ...
Я никогда не работала профессиональным фронтенд-разработчиком, и хотя уже 15 лет пишу HTML/CSS/JS для небольших побочных проектов, но все проекты были довольно маленькими. Бывает, что...
Давайте немного поговорим о том, как наблюдать за тем, какой объём ресурсов процессора потребляет JavaScript-код приложений. При этом предлагаю построить наш разговор вокруг компонентов — базовых...
Ранее в одном из наших КП добавление задач обрабатывалось бизнес-процессами, сейчас задач стало столько, что бизнес-процессы стали неуместны, и понадобился инструмент для массовой заливки задач на КП.