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

🚀 Записи Java 14 💾 (Предварительный просмотр)

Запись Java 14 – это новый вид объявления типа на языке Java. Как и перечисление, запись является ограниченной формой класса. Он объявляет свое представление и передает его API, который соответствует этому представлению. Помеченные java, jdk, java 14, записи.

💾 🏁 Записей

Record – это новый вид объявления типа в языке Java. Как и enum ,/| record является ограниченной формой класса. Он объявляет свое представление и передает его API, который соответствует этому представлению. Записи отказываются от свободы, которой обычно пользуются классы: возможности отделять API от представления. В свою очередь, записи приобретают значительную степень краткости.

У записи есть имя и описание состояния. Описание состояния объявляет компоненты записи. Необязательно, запись имеет тело. Например:

record Point(int x, int y) { }

Давайте разберемся начатый

⬇️ Скачать OpenJDK 14.0.1

🚥 Установите JAVA_HOME так , чтобы он указывал на загруженный JDK 14

$ export JAVA_HOME=/path/to/jdk14
$ export PATH=$JAVA_HOME/bin:$PATH

🚀 Пишем нашу первую запись на Java 💾

public record Person(
    String firstName,
    String lastName,
    String address,
    LocalDate birthday,
    List achievements) {
}

💻 Скомпилируйте его с помощью javac

$ javac --enable-preview -source 14 Person.java  

💻 Скомпилируйте его с помощью maven

Добавьте следующую конфигурацию для плагина компилятора в свой pom.xml


    maven-compiler-plugin
    3.8.1
    
        14
        --enable-preview
    

$ mvn compile

🚧 Что генерируется компилятором?

$ javap -p Person.class
public final class Person extends java.lang.Record {
  private final java.lang.String firstName;
  private final java.lang.String lastName;
  private final java.lang.String address;
  private final java.time.LocalDate birthday;
  private final java.util.List achievements;
  public Person(java.lang.String, java.lang.String, java.lang.String, java.time.LocalDate, java.util.List);
  public java.lang.String toString();
  public final int hashCode();
  public final boolean equals(java.lang.Object);
  public java.lang.String firstName();
  public java.lang.String lastName();
  public java.lang.String address();
  public java.time.LocalDate birthday();
  public java.util.List achievements();
}

Поскольку записи семантически претендуют на то, чтобы быть простыми и прозрачными владельцами своих данных, запись автоматически приобретает множество стандартных элементов:

  • Частное конечное поле для каждого компонента описания состояния;
  • Общедоступный метод доступа для чтения для каждого элемента описания состояния с тем же именем и типом, что и у компонента;
  • Открытый конструктор, сигнатура которого совпадает с описанием состояния, который инициализирует каждое поле из соответствующего аргумента;
  • Реализации equals и hashCode, которые говорят, что две записи равны, если они одного типа и содержат одно и то же состояние; и
  • Реализация toString, которая включает в себя строковое представление всех компонентов записи с их именами.

Предупреждающий знак Неглубоко Неизменяемые Данные

Аналогично тестам, которые мы проводили в статье Неизменяемые/Автоматическое значение/Ломбок какой? где мы проверяем поведение по умолчанию с точки зрения неизменяемости для этих библиотек, с помощью приведенного ниже теста мы демонстрируем утверждение, упомянутое в JEP 359: Записи :

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

📐 Проверка неизменяемости

@Test
void immutability() {
    // Create a mutable list with 1 element
    var achievements1 = new ArrayList();
    achievements1.add("Speaker");
    achievements1.add("Blogger");
    var achievements2 = List.of("Speaker", "Blogger");


    // Create person 1, assigning the list1
    var person1 = new Person(
            "John",
            "Doe",
            "USA",
            LocalDate.of(1990, 11, 11),
            achievements1
    );

    // Create person 2, assigning the list2
    var person2 = new Person(
            "John",
            "Doe",
            "USA",
            LocalDate.of(1990, 11, 11),
            achievements2
    );

    // Compare the 2 objects
    // Test passes since the fields contain the same values
    assertThat(person1).isEqualTo(person2);

    // Mutate the list used on Model 1
    achievements1.add("AnotherValue");

    // Compare the 2 objects:
    // - PASSES objects are NOT EQUAL for Records 😮 🔴
    assertThat(person1).isNotEqualTo(person2);
}

Существует два способа гарантировать неизменность при использовании записей с изменяемыми типами данных в их подписи или когда тип данных является интерфейсом, и мы не уверены в реализации, т.Е. java.util. Дата или java.util. Список

1) Создайте безопасную копию типа данных в конструкторе записи. 2) Передавайте только неизменяемые объекты при создании записей.

Выводы 🔆

  • Записи могут сократить несколько строк кода до однострочного.
  • ✅ С помощью JDK 14 мы можем отказаться от использования некоторых библиотек генерации кода для минимизации шаблонного кода.
  • ✅ Отличный вариант для:
    • 🔝 Узлы дерева
    • 🔝 DTO
    • 🔝 Составные ключи карты
    • Сообщений 🔝
    • 🔝 Обертки значений
    • 🔝 Дискриминируемые субъекты
  • Важно Записи являются только Неглубоко неизменяемый , что означает, что мы должны принимать во внимание передаваемые им типы данных, если мы хотим гарантировать неизменность.
  • Важно Записи – это функция предварительного просмотра языка, и она еще не является стандартом в JDK.

Статья по теме:

Горячий напиток Неизменяемые/Автоматическое значение/Ломбок 🔥 какой?

Карлос Чачин ☕ 👽 – 13 апреля 20 – 5 минут чтения

Оригинал: “https://dev.to/cchacin/java-14-records-preview-37om”