Lombok уменьшает шаблонный Java-код. @Data объединяет генерацию getters, setters для non-final полей, toString, equals/hashCode и RequiredArgsConstructor. Это не безусловный конструктор со всеми полями; явно написанный конструктор подавляет его генерацию через @Data. Аннотация удобна для простых моделей данных, если автоматически выбранная семантика действительно подходит.
Что такое Lombok и что делает аннотация @Data? Для каких классов ее удобно применять?
Какие методы объединяет @Data, как выбираются параметры конструктора и почему удобство Lombok не отменяет проверки изменяемости, равенства и содержимого toString.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Lombok — инструмент для Java, позволяющий сокращать шаблонный код с помощью аннотаций. @Data объединяет возможности @Getter, @Setter, @ToString, @EqualsAndHashCode и @RequiredArgsConstructor. По умолчанию getters создаются для нестатических полей, а setters — только для нестатических non-final полей; эти методы публичные. Статические поля пропускаются, а transient не участвуют в equals и hashCode. Эти правила описаны в документации @Data.
Конструктор получает параметры для неинициализированных final-полей и полей с @NonNull, не инициализированных при объявлении. Это не то же самое, что конструктор со всеми полями. Для @NonNull добавляется проверка значения; подробности приведены в документации конструкторов. Если в классе явно написан конструктор, сама @Data свой конструктор не генерирует. Поэтому нельзя без проверки обещать наличие конструктора без аргументов.
Аннотация удобна для простых DTO и изменяемых моделей данных, когда нужен именно такой набор методов. Однако ее не следует добавлять ко всем классам автоматически. Сеттеры могут нарушить задуманные ограничения объекта, а toString — раскрыть чувствительные поля или обойти циклические связи.
Отдельно проверьте семантику равенства: какие поля действительно определяют объект, допустима ли их изменяемость и как учитывается наследование. Настройка состава полей описана в документации equals/hashCode. Для сложных доменных объектов разумнее выбирать отдельные аннотации или явно писать важные методы. @Data экономит строки, но не принимает архитектурные решения за разработчика.