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, компактный конструктор и методы.