Lombok в Java: избавляемся от бойлерплейта

от автора

Привет, Хабр!

Если вы писали на Java хоть раз, то знаете этот ужас — бесконечные геттеры, сеттеры, конструкторы, да ещё toString() и equals() на закуску. Одной только стандартной обвязки в классах моделей больше, чем самого кода.

Lombok — это библиотека, которая берёт всё это бойлерплейтное безумие и оставляет только чистую суть.

Что делает Lombok?

  • Генерирует геттеры, сеттеры, toString(), equals() и другие методы автоматически.

  • Упрощает создание конструкторов и билдеров.

  • Уменьшает количество кода в разы.

Например:

public class User {     private String username;     private String email;      public User() {}      public User(String username, String email) {         this.username = username;         this.email = email;     }      public String getUsername() { return username; }     public void setUsername(String username) { this.username = username; }     public String getEmail() { return email; }     public void setEmail(String email) { this.email = email; }      @Override     public String toString() {         return "User{" + "username='" + username + '\'' + ", email='" + email + '\'' + '}';     } } 

15 строк. Ради двух полей.

То же самое, но с Lombok:

import lombok.*;  @Data @AllArgsConstructor @NoArgsConstructor public class User {     private String username;     private String email; }

И все. Три аннотации заменили 15 строк шаблонного кода.

Lombok использует аннотации, которые на этапе компиляции добавляют в код всю скучную обвязку. Это происходит на уровне APT.

При компиляции Lombok генерирует дополнительные методы прямо в байткод, поэтому на runtime его вообще нет. Это значит, что:

  1. IDE может видеть и использовать эти методы.

  2. Никаких зависимостей в коде.

  3. Скорость работы не страдает.

Но есть и нюансы, например, IDE должна поддерживать Lombok.

Аннотаций Lombok

@Getter и @Setter

Было:

public class User {     private String name;      public String getName() { return name; }     public void setName(String name) { this.name = name; } }

Стало:

import lombok.Getter; import lombok.Setter;  @Getter @Setter public class User {     private String name; }

Теперь getName() и setName() автоматически создаются компилятором.

Но если вдруг нужно только геттер, но без сеттера, можно сделать так:

@Getter public class ImmutableUser {     private final String username; }

Теперь username можно читать, но нельзя изменять — удобно для иммутабельных объектов.

@ToString — избавляет от ручного написания toString()

Было:

public class Product {     private String name;     private double price;      @Override     public String toString() {         return "Product{name='" + name + "', price=" + price + "}";     } }

Стало:

import lombok.ToString;  @ToString public class Product {     private String name;     private double price; }

Теперь System.out.println(product); автоматически выведет что‑то вроде:

Product(name=iPhone, price=999.99)

Можно даже исключить поля из toString():

@ToString(exclude = "password") public class Account {     private String username;     private String password; }

@EqualsAndHashCode — избавляет от ручного написания equals() и hashCode()

Эта аннотация делает объекты сравнимыми:

import lombok.EqualsAndHashCode;  @EqualsAndHashCode public class Customer {     private int id;     private String name; }

Теперь new Customer(1, "Alice").equals(new Customer(1, "Alice")) вернёт true.

Если нужно исключить поле (например, не учитывать id в сравнении):

@EqualsAndHashCode(exclude = "id") public class Customer {     private int id;     private String name; }

@Data — универсальная аннотация

Хотите всё сразу? @Data объединяет:

  • @Getter

  • @Setter

  • @EqualsAndHashCode

  • @ToString

  • @RequiredArgsConstructor

import lombok.Data;  @Data public class Order {     private String product;     private int quantity; }

Теперь:

  • Геттеры и сеттеры есть.

  • toString() есть.

  • equals() и hashCode() тоже есть.

И никаких лишних строк.

Настройка Lombok в проекте

Сначала подключим в Maven. Добавляем в pom.xml:

<dependencies>     <dependency>         <groupId>org.projectlombok</groupId>         <artifactId>lombok</artifactId>         <version>1.18.26</version>         <scope>provided</scope>     </dependency> </dependencies> 

Подключение в Gradle:

dependencies {     compileOnly 'org.projectlombok:lombok:1.18.26'     annotationProcessor 'org.projectlombok:lombok:1.18.26' }

Включаем в IntelliJ IDEA:

  • Устанавливаем плагин Lombok (Preferences → Plugins → Lombok Plugin).

  • Включаем аннотации в Settings → Compiler → Annotation Processors.

Теперь IDE понимает Lombok.

А вы используете Lombok в своих проектах? Или пишете геттеры и toString() в ручную? Делитесь в комментариях.


Разработчикам на Java рекомендую обратить внимание на открытые уроки, которые пройдут в феврале в Otus:

  • 12 февраля: «Resilience4j. Bulkhead»
    Познакомимся с библиотекой Resilience4j и рассмотрим Bulkhead для защиты приложений от перегрузок. Записаться

  • 24 февраля: «Resilience4j. RateLimiter»
    Познакомимся с библиотекой Resilience4j и рассмотрим RateLimiter для контроля нагрузки и защиты микросервисов. Записаться


ссылка на оригинал статьи https://habr.com/ru/articles/879852/