Сначала ответь вслух
Скажи ответ вслух хотя бы пару минут, потом открой эталон и сравни. Эталон открыт всем и не требует входа.
Показать ответ
Эталонный ответ
Record (Java 16) описывает данные одной строкой. Компилятор создаёт private final поле на каждый компонент, канонический конструктор, методы доступа с именами компонентов (name(), а не getName()) и equals, hashCode, toString по всем компонентам.
- Класс record неявно final и наследуется от
java.lang.Record: расширить его или унаследовать от другого класса нельзя. - Интерфейсы реализовывать можно, статические поля и методы объявлять можно.
- Дополнительные поля экземпляра объявлять нельзя: состояние задают только компоненты.
record Order(String id, List<String> items) {
Order { // компактный конструктор
Objects.requireNonNull(id);
items = List.copyOf(items); // защитная копия
}
}Неизменяемость у record поверхностная: если компонент изменяемый, его содержимое можно поменять снаружи. Поэтому коллекции копируют в компактном конструкторе.
Как у тебя получилось?
Уточняющие вопросы
Так обычно копают глубже. Раскрой строку, когда ответишь вслух.
Уточнение 1-го уровня: Как проверить аргументы record?
Ответ уровня Middle
В компактном конструкторе: он выполняется перед присваиванием полей и может заменить значения параметров.
Уточнение 2-го уровня: Подойдёт ли record для JPA-сущности?
Ответ уровня Middle
Нет: сущности нужен конструктор без аргументов, изменяемое состояние и возможность создать прокси-наследника. Record подходит для DTO и проекций запросов.
Типичные ошибки
- Считать record полностью неизменяемым при изменяемых компонентах.
- Ждать методов getName() вместо name().
Первоисточники
Быстрые задания по теме
Для темы «Records и sealed-классы» быстрых заданий пока нет
Можно проверить всю зону «Java Core» тестом на 10 минут.
Проверить себя за 10 минут