Для чего предназначен record?
- Чем record отличается от обычного класса?
- Можно ли добавить проверку в конструктор record?
- Можно ли использовать record как JPA-сущность?
- Что такое record и когда его использовать?
record — компактный неизменяемый носитель данных: поля в заголовке, а конструктор, аксессоры, equals, hashCode и toString создаёт компилятор.
- Поля final, наследоваться от класса нельзя, но интерфейсы реализовывать можно
- Проверки — в компактном конструкторе
А ещё Неизменяемы поля, а не объекты по ссылкам: список внутри нужно копировать
Подробно
Record (Java 16) убирает шаблонный код для классов-данных: DTO, ключей составных карт, промежуточных результатов. Объявление record Point(int x, int y) даёт:
private finalполяxиy;- канонический конструктор;
- аксессоры
x()иy()(без префикса get); equalsиhashCodeпо значениям полей;- читаемый
toString.
Ограничения: record неявно final, не может наследовать класс (но реализует интерфейсы), не может объявлять дополнительные поля экземпляра. Можно добавлять методы, статические поля и конструкторы.
Проверку и нормализацию данных делают в компактном конструкторе — без списка параметров.
Важная тонкость: неизменяемы ссылки, а не объекты. Если поле — список, его стоит копировать в неизменяемый (List.copyOf).
JPA-сущностью record быть не может: Hibernate нужны изменяемые поля и конструктор без аргументов. А вот для DTO и проекций запросов он отлично подходит.
Пример
public record Money(BigDecimal amount, String currency) {
public Money { // компактный конструктор
if (amount.signum() < 0) throw new IllegalArgumentException("amount < 0");
currency = currency.toUpperCase();
}
}
new Money(new BigDecimal("10"), "rub").equals(new Money(new BigDecimal("10"), "RUB")); // trueЧто хотят услышать
- Что генерирует компилятор.
- Неизменяемость и ограничения.
- Компактный конструктор для проверок.
- Нюанс с изменяемыми полями и JPA — плюс.
Частые ошибки
- Пытаться добавить сеттеры или унаследовать record от класса.
- Считать объект полностью неизменяемым при изменяемых полях внутри.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Для объявления класса, поля которого можно менять без сеттеров
- ✗Для замены интерфейсов в функциональном программировании
- ✗Для описания таблиц базы данных
- ✓Для неизменяемого носителя данных с готовыми equals и toString
Что спросят дальше
- Что делает компактный конструктор?
- Когда record — неудачный выбор?
- Чем record отличается от class?
- Что такое compact constructor?
Разбор темы
- Records: компактные носители данных
Что генерирует record, канонический и компактный конструкторы, ограничения и когда применять.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.