Записи (records) появились как превью фича в java 14. В этом посте разберём, что такое записи, чем отличаются от классов и как их использовать.
Записи определяют неизменяемый набор значений:
record Point(int x, int y) {}
Создаются так же, как и другие классы:Point p = new Point(1,2);В чём особенность?
🔸 Поля нельзя поменять: ни внутри методов, ни через рефлекшн
🔸 Нет приватных полей
🔸 Не участвуют в наследовании
🔸 Конструктор по умолчанию не пустой, а с заданными полями
🔸 Добавлены геттеры по умолчанию:
p.x()🔸 toString по умолчанию
p.y()
Point[x=1, y=2]🔸 equals и hashcode по умолчанию
🔸 Для сериализации не нужен serialVersionUID
Запись - специальный класс для хранения данных.
record Point компилируется в public final class Point extends java/lang/RecordВсе остальные функции класса сохраняются:
✅ Определять методы
✅ Реализовать интерфейсы
✅ Добавлять static поля и методы
✅ Ставить аннотации
✅ Использовать дженерики
Ещё одна особенность records — конструктор. Конструктор по умолчанию содержит все поля и называется канонический конструктор:
public Point(int x, int y){
this.x=x;
this.y=y;
}
Он доступен по умолчанию, его можно не писать. Переопределяйте конструктор, если нужно добавить проверку аргументов:public Point(int x, int y){
if (x>100) throw new …
this.x=x;
this.y=y;
}
Для канонического конструктора есть краткая запись. Можно опустить присвоение переменных и оставить только нужные проверки:public Point {
if (x>100) throw new ...
}
Другие конструкторы должны вызывать канонический:public Point(int x) {
this(x,0);
}
Где использовать записи:1️⃣ В многопоточных алгоритмах
Неизменяемые значения не нужно синхронизировать.
2️⃣ Data Transfer Object (DTO)
Для отправки данных пользователю или в другую систему.
record UserDTO(long id, String name) {
public UserDTO(User user) {…}
}
3️⃣ Как промежуточные значения в Stream APIДля упрощения сложного кода и большей читаемости.
4️⃣ Как составное возвращаемое значение
Когда не хочется создавать отдельный класс ради одного метода:
record MinMax<T>(T min, T max) {}
❗️Правильный ответ на вопрос перед постом: В записях поля неизменны, также записи не участвуют в наследовании и не содержат приватных полей.