Что делает аннотация @Data в Lombok?

«Что делает аннотация @Data в Lombok?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Аннотация @Data из проекта Lombok — это комбинация нескольких аннотаций, которая генерирует стандартный шаблонный (boilerplate) код для класса модели (POJO).

Она автоматически создает:

  • Геттеры для всех нестатических полей.
  • Сеттеры для всех нестатических не-final полей.
  • Реализацию toString().
  • Реализацию equals() и hashCode() на основе всех нестатических полей.
  • Конструктор, принимающий все final и неинициализированные не-final поля (т.н. RequiredArgsConstructor).

Пример использования:

import lombok.Data;

@Data
public class User {
    private final Long id;
    private String name;
    private int age;
}
// Lombok сгенерирует getters, setters (кроме id),
// equals, hashCode, toString и конструктор User(Long id).

Важные предостережения и best practices:

  • Не используйте @Data для JPA/Hibernate сущностей. Сгенерированные equals() и hashCode(), включающие все поля, могут вызвать проблемы с ленивой загрузкой (Lazy Loading) и привести к неожиданному поведению. Для сущностей лучше генерировать эти методы вручную или использовать другие стратегии.
  • Для создания неизменяемых (immutable) объектов рассмотрите аннотацию @Value.
  • @Data делает класс мутабельным (изменяемым) из-за сеттеров. Если это не требуется, используйте более специфичные аннотации (@Getter, @Setter, @ToString и т.д.).