Что верно про record в Java?
- Что компилятор генерирует для record и когда record использовать не стоит?
- Что компилятор генерирует для record и в каких случаях record использовать не стоит?
Компилятор генерирует private final поля, канонический конструктор, аксессоры (name(), без get), equals, hashCode, toString по всем компонентам. Record неявно final, наследует java.lang.Record и не может расширять другой класс, но реализует интерфейсы. Компактный конструктор — для валидации и нормализации.
- Можно добавлять методы, статические поля, свои конструкторы (делегирующие каноническому)
- Полей экземпляра сверх компонентов — нельзя
- Не подходит: изменяемые сущности (JPA), сокрытие представления, наследование
А ещё Сериализация record идёт через канонический конструктор — инварианты проверяются
Подробно
Record — это прозрачный носитель данных: состояние объявлено в заголовке, и всё остальное компилятор выводит из него. Наследоваться record не может (неявно final и уже наследует java.lang.Record), но интерфейсы реализовывать вправе. Компактный конструктор — самая полезная деталь на практике: в нём проверяют инварианты и нормализуют аргументы, а присваивание полей компилятор добавит сам. Важная оговорка про неизменяемость: неизменяемы сами поля, а не то, на что они ссылаются — список внутри record можно менять, поэтому для настоящей неизменяемости в компактном конструкторе делают защитную копию.
Пример
record Money(BigDecimal amount, String currency) {
Money {
Objects.requireNonNull(currency);
if (amount.signum() < 0) throw new IllegalArgumentException();
}
}Что хотят услышать
- Что генерируется.
- Ограничения record.
- Компактный конструктор.
Частые ошибки
- Считать record полностью неизменяемым при наличии изменяемых компонентов.
- Пытаться унаследовать record от класса.
Проверьте себя
Несколько верных вариантов. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Компилятор генерирует equals, hashCode и toString по компонентам
- ✗Компоненты record можно сделать изменяемыми, если добавить к ним сеттеры вручную
- ✓Record неявно final и не может наследовать другой класс
- ✓Компактный конструктор проверяет параметры до присваивания
Что спросят дальше
- Как сделать защитную копию в компактном конструкторе?
- Чем record отличается от класса, сгенерированного Lombok?
- Как record ведёт себя при десериализации из JSON?
- Зачем нужна деконструкция record в pattern matching?
Разбор темы
- Records: компактные носители данных
Что генерирует record, канонический и компактный конструкторы, ограничения и когда применять.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.