Открыть сервис

@Data

@Data — это аннотация (декларативный маркер) в языке программирования Java, относящаяся к проекту Lombok, которая автоматически генерирует типовые методы для классов, предназначенных для хранения данных (POJO, Plain Old Java Object). Она объединяет в себе функциональность нескольких других аннотаций Lombok: @ToString, @EqualsAndHashCode, @Getter (для всех полей), @Setter (для всех нефинальных полей) и @RequiredArgsConstructor. Применение @Data позволяет значительно сократить объём шаблонного кода (boilerplate code), делая классы более компактными и читаемыми.

История и контекст

Аннотация @Data была введена в рамках проекта Lombok, созданного норвежским разработчиком Роаром Ольсеном (Roar Olsen) в 2009 году. Lombok возник как ответ на критику многословности Java, особенно в контексте создания простых классов-моделей. Идея заключалась в использовании процессоров аннотаций (annotation processors), работающих на этапе компиляции, для автоматической вставки сгенерированного кода непосредственно в байт-код или исходный файл.

@Data стала одной из самых популярных аннотаций Lombok, так как она решает наиболее частую задачу — создание «бобов» (beans) с геттерами, сеттерами, методами equals(), hashCode(), toString() и конструктором. До появления Lombok разработчики либо писали эти методы вручную, либо полагались на IDE (например, Eclipse или IntelliJ IDEA) для их генерации, что приводило к загромождению исходного кода.

Функциональность и генерируемые методы

Аннотация @Data является композитной. При её использовании на уровне класса компилятор Lombok генерирует следующие элементы:

Если в классе нет ни final, ни @NonNull полей, конструктор с параметрами не создаётся.

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

Приведённый ниже код с использованием @Data:

```java import lombok.Data;

@Data public class User { private final long id; private String name; private String email; private int age; } ```

Эквивалентен следующему полному классу, написанному вручную:

```java import java.util.Objects;

public class User { private final long id; private String name; private String email; private int age;

public User(long id) { this.id = id; }

public long getId() { return id; }

public String getName() { return name; }

public void setName(String name) { this.name = name; }

public String getEmail() { return email; }

public void setEmail(String email) { this.email = email; }

public int getAge() { return age; }

public void setAge(int age) { this.age = age; }

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

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

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

Взаимодействие с другими аннотациями Lombok

@Data может комбинироваться с другими аннотациями Lombok для тонкой настройки поведения:

Ограничения и критика

Несмотря на широкую популярность, использование @Data имеет ряд ограничений и критических замечаний:

Альтернативы

В современной Java-экосистеме существуют альтернативы Lombok и @Data:

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →