Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Справочник Java

record

Объявляет запись — неизменяемый класс для хранения данных с готовыми equals(), hashCode() и toString().

Доступно с: Java 16

Синтаксис

record Name(Type field1, Type field2) { }

Примеры

Одна строка вместо класса с конструктором, геттерами и equals():

record Point(int x, int y) {}
 
void main() {
    var p = new Point(3, 4);
    IO.println(p);
    IO.println(p.x() + p.y());
    IO.println(p.equals(new Point(3, 4)));
}

Результат:

Point[x=3, y=4]
7
true

Компактный конструктор для проверки и свои методы:

record Money(String currency, long cents) {
    Money {
        if (cents < 0) {
            throw new IllegalArgumentException("negative amount");
        }
    }
 
    Money plus(Money other) {
        return new Money(currency, cents + other.cents);
    }
}
 
void main() {
    var total = new Money("EUR", 250).plus(new Money("EUR", 199));
    IO.println(total);
    try {
        new Money("EUR", -1);
    } catch (IllegalArgumentException e) {
        IO.println(e.getMessage());
    }
}

Результат:

Money[currency=EUR, cents=449]
negative amount

Разбор записи в switch и instanceof (record patterns, Java 21):

record Point(int x, int y) {}
 
void main() {
    Object o = new Point(0, 5);
    String where = switch (o) {
        case Point(int x, int y) when x == 0 -> "on the Y axis at " + y;
        case Point(int x, int y) -> "at " + x + ", " + y;
        default -> "not a point";
    };
    IO.println(where);
}

Результат:

on the Y axis at 5

Примечания

Поля записи private final, сеттеров нет; методы доступа называются как поля, без get: p.x(), а не p.getX(). Запись нельзя унаследовать и сама она не может наследоваться от класса, но может реализовывать интерфейсы. Можно добавлять методы и статические поля, но не обычные поля объекта.

Если поле — изменяемый объект (например, List), запись неизменяема только «снаружи»: в компактном конструкторе делайте копию items = List.copyOf(items);.

См. также

  • class — Объявляет класс — описание объектов: их полей и методов.
  • Object.equals() — Сравнивает объекты по смыслу. По умолчанию работает как ==, поэтому в своих классах его переопределяют.
  • Object.toString() — Возвращает текстовое представление объекта; вызывается при выводе и сложении со строкой.
  • sealed / permits — Ограничивает список классов, которым разрешено наследоваться от класса или реализовывать интерфейс.
  • final — Запрещает менять переменную после присваивания, переопределять метод или наследовать класс.

Вопросы и ответы по теме

В учебнике

  • Записи (record) — Записи record в Java: короткое объявление класса для данных, готовые equals, hashCode и toString, компактный конструктор и методы.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.