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

Что верно про record в Java?

MiddleСовременная JavaJava >=16
Ещё спрашивают так:
  • Что компилятор генерирует для record и когда record использовать не стоит?
  • Что компилятор генерирует для record и в каких случаях record использовать не стоит?
Коротко

Компилятор генерирует private final поля, канонический конструктор, аксессоры (name(), без get), equals, hashCode, toString по всем компонентам. Record неявно final, наследует java.lang.Record и не может расширять другой класс, но реализует интерфейсы. Компактный конструктор — для валидации и нормализации.

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

А ещё Сериализация record идёт через канонический конструктор — инварианты проверяются

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

Подробно

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 неявно final и не может наследовать другой класс
  • ✓Компактный конструктор позволяет проверить и нормализовать параметры до присваивания полей
  • ✗Компоненты record можно объявить изменяемыми, добавив сеттеры

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

  • Как сделать защитную копию в компактном конструкторе?
  • Чем record отличается от класса, сгенерированного Lombok?
  • Как record ведёт себя при десериализации из JSON?
  • Зачем нужна деконструкция record в pattern matching?

Разбор темы

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

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

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

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

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