Что делает @Data в Lombok?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что делает @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 напрямую
Итоговая таблица
| Компонент | Что генерирует |
|---|---|
| @Getter | getter методы для всех полей |
| @Setter | setter методы для всех полей |
| @ToString | метод toString() со всеми полями |
| @EqualsAndHashCode | методы equals() и hashCode() |
| @RequiredArgsConstructor | конструктор для final полей |
Вывод
@Data в Lombok — это мощный инструмент для генерации стандартного boilerplate кода, который превращает класс из 50+ строк в 5-10 строк. Это особенно полезно для POJO классов, DTO (Data Transfer Objects) и сущностей (entities) в ORM приложениях.