← Назад к вопросам

Что делает @Data в Lombok?

1.0 Junior🔥 161 комментариев
#Spring Boot и Spring Data#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что делает @Data в Lombok?

@Data — это комбинированная аннотация из библиотеки Lombok, которая генерирует для класса стандартные методы и функциональность, необходимые для обычного Java класса, содержащего данные (POJO — Plain Old Java Object).

Что генерирует @Data

@Data объединяет несколько отдельных аннотаций Lombok в одну и эквивалентна следующему:

@Getter
@Setter
@ToString
@EqualsAndHashCode
@RequiredArgsConstructor

Подробный разбор каждого компонента

1. @Getter — генерирует getter методы

@Data
public class User {
    private String name;
    private int age;
}

// Lombok автоматически генерирует:
// public String getName() { return this.name; }
// public int getAge() { return this.age; }

2. @Setter — генерирует setter методы

// Lombok также генерирует:
// public void setName(String name) { this.name = name; }
// public void setAge(int age) { this.age = age; }

User user = new User();
user.setName("Иван");
user.setAge(30);

3. @ToString — генерирует метод toString()

// Автоматически генерируется метод:
// public String toString() {
//     return "User(name=" + this.name + ", age=" + this.age + ")";
// }

User user = new User("Иван", 30);
System.out.println(user); // User(name=Иван, age=30)

4. @EqualsAndHashCode — генерирует equals() и hashCode()

// Автоматически генерируются:
// public boolean equals(Object o) { ... }
// public int hashCode() { ... }

User user1 = new User("Иван", 30);
User user2 = new User("Иван", 30);

System.out.println(user1.equals(user2)); // true
System.out.println(user1.hashCode() == user2.hashCode()); // true

Это позволяет корректно использовать объекты в коллекциях (HashSet, HashMap):

Set<User> users = new HashSet<>();
users.add(new User("Иван", 30));
users.add(new User("Иван", 30)); // не добавится, так как equals вернет true
System.out.println(users.size()); // 1

5. @RequiredArgsConstructor — генерирует конструктор

// Lombok генерирует конструктор для final полей:
public User(String name) {
    this.name = name;
}

// Или если нет final полей — конструктор без параметров:
public User() {}

Полный пример

С Lombok:

import lombok.Data;

@Data
public class User {
    private String name;
    private int age;
    private String email;
}

Без Lombok (эквивалентный код):

public class User {
    private String name;
    private int age;
    private String email;

    public User() {}

    public String getName() { return this.name; }
    public void setName(String name) { this.name = name; }
    
    public int getAge() { return this.age; }
    public void setAge(int age) { this.age = age; }
    
    public String getEmail() { return this.email; }
    public void setEmail(String email) { this.email = email; }

    @Override
    public String toString() {
        return "User(name=" + this.name + ", age=" + this.age + ", email=" + this.email + ")";
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return age == user.age && 
               Objects.equals(name, user.name) && 
               Objects.equals(email, user.email);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age, email);
    }
}

Конфигурация @Data

Вы можете кастомизировать поведение аннотации:

// Исключить поле из equals и hashCode
@Data
public class User {
    private String name;
    
    @EqualsAndHashCode.Exclude
    private String password; // не участвует в equals/hashCode
}

// Исключить поле из toString
@Data
public class User {
    private String name;
    
    @ToString.Exclude
    private String password; // не показывается в toString
}

Важные моменты

Установка Lombok:

<!-- pom.xml для Maven -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.30</version>
    <scope>provided</scope>
</dependency>

Плюсы использования @Data

  • Меньше кода — вместо 50 строк пишешь 5
  • Меньше ошибок — нет рутинных опечаток в getters/setters
  • Чище читаемость — фокус на бизнес-логике, а не на boilerplate
  • Легче рефакторинг — добавил поле → Lombok сам обновит все методы

Минусы

  • Неявный код — методы генерируются "за кулисами"
  • Зависимость — проект привязан к Lombok
  • Дебаг сложнее — сгенерированный код не виден в IDE напрямую

Итоговая таблица

КомпонентЧто генерирует
@Gettergetter методы для всех полей
@Settersetter методы для всех полей
@ToStringметод toString() со всеми полями
@EqualsAndHashCodeметоды equals() и hashCode()
@RequiredArgsConstructorконструктор для final полей

Вывод

@Data в Lombok — это мощный инструмент для генерации стандартного boilerplate кода, который превращает класс из 50+ строк в 5-10 строк. Это особенно полезно для POJO классов, DTO (Data Transfer Objects) и сущностей (entities) в ORM приложениях.

Что делает @Data в Lombok? | PrepBro