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

Для чего предназначен record?

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

record — компактный неизменяемый носитель данных: поля в заголовке, а конструктор, аксессоры, equals, hashCode и toString создаёт компилятор.

  • Поля final, наследоваться от класса нельзя, но интерфейсы реализовывать можно
  • Проверки — в компактном конструкторе

А ещё Неизменяемы поля, а не объекты по ссылкам: список внутри нужно копировать

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

Подробно

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, hashCode и toString
  • ✗Для объявления класса, поля которого можно менять без сеттеров
  • ✗Для замены интерфейсов в функциональном программировании
  • ✗Для описания таблиц базы данных

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

  • Что делает компактный конструктор?
  • Когда record — неудачный выбор?
  • Чем record отличается от class?
  • Что такое compact constructor?

Разбор темы

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

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

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

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

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