Records з’явились в java починаючи з 14 версії. Вони надають можливість описати Value Objects без використання великої кількості шаблонного коду.
Value Objects
Value Objects зберігають в собі дані для їх перенесення між частинами програми. Такий об’єкт містить в собі поля, конструктори та методи доступу до його полів, а також може містити перевизначені методи equals(), hashCode() та toString(). Ще однією важливою рисою Value Objects є те, що вони повинні бути immutable (незмінними). Класичний спосіб опису об’єкту значення за допомогою java без використання сторонніх бібліотек:
public class User {
private final String firstName;
private final String lastName;
public User(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return Objects.equals(firstName, user.firstName) && Objects.equals(lastName, user.lastName);
}
@Override
public int hashCode() {
return Objects.hash(firstName, lastName);
}
@Override
public String toString() {
return "User{" +
"firstName='" + firstName + '\'' +
", lastName='" + lastName + '\'' +
'}';
}
}Java Records
Якщо переписати клас User за допомогою Java Records вийде:
public record User(String firstName, String lastName) {}Протестуємо record User:
public class Main {
public static void main(String[] args) {
User userOne = new User("Patrick", "Adams");
User userTwo = new User("Patrick", "Adams");
System.out.println("User one first name: " + userOne.firstName());
System.out.println("User two to string: " + userTwo);
System.out.println("User one is equals user two: " + userOne.equals(userTwo));
}
}Результат:
User one first name: Patrick
User two to string: User[firstName=Patrick, lastName=Adams]
User one is equals user two: trueВисновки
Поведінка java record за замовчуванням:
- автоматично генерується канонічний конструктор, котрий в якості параметрів приймає всі значення та встановлює їх у поля record
- поля за замовчуванням private final
- автоматично генеруються методи доступу для всіх полів (без додавання традиційного get). У нашому випадку firstName() та lastName()
- автоматично генеруються методи equals(), hashCode(), toString(). Вони містять в собі всі поля record