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

Мітки: