💾 🏁 Записей
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”