Получить доступ

Когда record — неудачный выбор?

MiddleСовременная JavaJava >=16
Коротко

Record прозрачен: компоненты — публичный контракт. Не подходит для изменяемых сущностей со скрытым представлением и охраняемыми инвариантами, для JPA-сущностей (нужны конструктор без аргументов, изменяемость, прокси), для иерархий наследования.

  • Удачно: DTO, ответы API, ключи составных карт, значения (Money, Range), кортежи результатов
  • Сменить внутреннее представление позже нельзя без смены API
  • Equals по всем компонентам — не всегда нужная семантика

А ещё JPA допускает record для @Embeddable (Hibernate 6.2+) и проекций

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Record описывает данные, а не поведение с охраняемыми инвариантами. Он неизменяем и публикует компоненты аксессорами, поэтому свободы поменять внутреннее представление позже у вас не будет — а это как раз то, ради чего существует инкапсуляция. Типичные удачные применения: DTO, ключи составных карт, промежуточные результаты в стримах, value objects домена вроде Money или OrderId. Неудачные: JPA-сущности с изменяемым состоянием и требованием конструктора без аргументов, а также классы, где представление хочется скрыть. При этом ключом карты record быть отлично умеет, интерфейсы реализует, а любой сгенерированный метод при желании можно переопределить вручную.

Что хотят услышать

  • Принцип прозрачности.
  • Неудачные и удачные применения.

Частые ошибки

  • Пытаться использовать record как JPA-сущность.
  • Считать, что у record нельзя переопределить сгенерированные методы.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Когда нужна сущность с изменяемым состоянием и инкапсуляцией внутреннего представления — record публикует свои компоненты как часть контракта
  • ✗Когда объект нужно использовать в качестве ключа HashMap
  • ✗Когда требуется реализовать интерфейс
  • ✗Когда нужно переопределить toString

Что спросят дальше

  • Почему record плохо подходит на роль JPA-сущности?
  • Как record сочетается с sealed-иерархиями?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем