tgoop.com/java_fillthegaps/168
Create:
Last Update:
Last Update:
Records: обзор
Записи (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) {3️⃣ Как промежуточные значения в Stream API
public UserDTO(User user) {…}
}
Для упрощения сложного кода и большей читаемости.
4️⃣ Как составное возвращаемое значение
Когда не хочется создавать отдельный класс ради одного метода:
record MinMax<T>(T min, T max) {}❗️Правильный ответ на вопрос перед постом:
В записях поля неизменны, также записи не участвуют в наследовании и не содержат приватных полей.
BY Java: fill the gaps
Share with your friend now:
tgoop.com/java_fillthegaps/168