В Java сокращённая форма описания модели данных называется record
. Это специальный тип данных, введённый в Java 14 (как preview feature), предназначенный для упрощения создания неизменяемых объектов (immutable objects).
Основные характеристики и преимущества record
включают:
- Неизменяемость. Все поля в
record
являются финальными (final) и устанавливаются только один раз, при создании объекта. - Автоматическое создание методов. Java автоматически генерирует методы
equals()
,hashCode()
,toString()
, а также методы доступа (геттеры) для полей. - Короткий синтаксис. Для определения
record
используется компактный синтаксис, что делает код более читаемым и уменьшает количество шаблонного кода (boilerplate code).
Пример использования record
:
public record Person(String name, int age) {
}
В этом примере Person
– это record
с двумя полями: name
и age
. Компилятор автоматически создаёт для этого record
следующие методы:
- Конструктор с двумя параметрами
name
иage
. - Методы-геттеры
name()
иage()
. - Методы
equals()
,hashCode()
,toString()
.
Полный пример использования:
public record Person(String name, int age) {
// Вложенные методы, если необходимы, могут быть добавлены здесь.
}
public class Main {
public static void main(String[] args) {
Person person = new Person("John", 30);
System.out.println(person.name()); // Output: John
System.out.println(person.age()); // Output: 30
System.out.println(person); // Output: Person[name=John, age=30]
}
}
Некоторые дополнительные возможности record
:
- Валидация данных. Вы можете добавлять проверки (валидацию) в конструктор, чтобы удостовериться, что создаваемые объекты корректны.
public record Person(String name, int age) {
public Person {
if (age < 0) {
throw new IllegalArgumentException("Age cannot be negative");
}
}
}
- Деконструкция. Записи поддерживают деконструкцию, что позволяет легко распаковывать значения полей:
public class Main {
public static void main(String[] args) {
Person person = new Person("Jane", 25);
String name = person.name();
int age = person.age();
System.out.printf("Name: %s, Age: %d%n", name, age);
// Деконструкция
var (n, a) = person;
System.out.printf("Name: %s, Age: %d%n", n, a);
}
}
Использование record
в Java помогает существенно уменьшить количество шаблонного кода, делая модели данных более читабельными и легкими для поддержки.