Lombok для Java: полное руководство с примерами

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Что такое Lombok и зачем он нужен?

Lombok (Project Lombok) — это библиотека для языка Java, которая позволяет значительно сократить объём шаблонного кода (boilerplate code). В Java разработчики часто пишут однотипные конструкции: геттеры, сеттеры, конструкторы, методы toString(), equals() и hashCode(). Lombok автоматически генерирует этот код на этапе компиляции с помощью аннотаций.

Основная цель Lombok — сделать код чище, короче и легче для поддержки. Вместо того чтобы писать десятки строк однообразного кода, вы просто добавляете одну аннотацию, и всё генерируется автоматически. Это особенно полезно для классов-моделей (POJO/DTO), где шаблонный код составляет до 70% всего объёма.

Lombok не является фреймворком времени выполнения — он работает исключительно на этапе компиляции. Сгенерированный код встраивается в байт-код, поэтому в рантайме никаких зависимостей от Lombok не требуется.

Установка Lombok

Lombok подключается как обычная зависимость в ваш проект. Поскольку это Java-библиотека, установка через pip или npm не применяется. Вот основные способы установки:

Maven

Добавьте в pom.xml:

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

Gradle

Добавьте в build.gradle:

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

IntelliJ IDEA

В IntelliJ IDEA необходимо установить плагин Lombok (Settings → Plugins → Marketplace → Lombok) и включить обработку аннотаций (Settings → Build, Execution, Deployment → Compiler → Annotation Processors → Enable annotation processing).

Eclipse

Скачайте JAR-файл Lombok с официального сайта и запустите его двойным щелчком — откроется установщик, который сам найдёт вашу IDE и пропишет необходимые настройки.

Быстрый старт с примером кода

Рассмотрим типичный класс Java до и после использования Lombok.

Без Lombok (традиционный подход):

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

    public User() {}

    public User(String name, int age, String email) {
        this.name = name;
        this.age = age;
        this.email = email;
    }

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

    @Override
    public String toString() {
        return "User{name='" + name + "', age=" + age + ", email='" + 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);
    }
}

С Lombok:

import lombok.*;

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

Всего 5 строк вместо 50! Код стал лаконичным, читаемым и лёгким для поддержки.

Основные аннотации и методы Lombok

Ниже представлены ключевые аннотации Lombok. Каждая из них генерирует определённый набор методов или функциональность.

1. @Getter и @Setter

Что делает: Генерирует геттеры и сеттеры для полей класса. Можно применять как к классу целиком, так и к отдельным полям.

Параметры:

  • value — уровень доступа (PUBLIC, PROTECTED, PACKAGE, PRIVATE). По умолчанию PUBLIC.
  • lazy — для @Getter: если true, поле инициализируется лениво (только при первом вызове геттера).

Пример:

import lombok.Getter;
import lombok.Setter;

public class Person {
    @Getter @Setter
    private String firstName;

    @Getter(AccessLevel.PROTECTED) @Setter
    private String lastName;

    @Getter(lazy = true)
    private final double[] cachedData = expensiveInitialization();

    private double[] expensiveInitialization() {
        // Долгая инициализация
        return new double[]{1.0, 2.0, 3.0};
    }
}

2. @ToString

Что делает: Генерирует метод toString(), который возвращает строковое представление объекта со всеми полями.

Параметры:

  • includeFieldNames — включать ли имена полей (true по умолчанию).
  • exclude — массив имён полей, которые нужно исключить.
  • callSuper — включать ли результат super.toString().

Пример:

import lombok.ToString;

@ToString(exclude = "password", callSuper = true)
public class Account extends BaseEntity {
    private String username;
    private String password;
    private String email;
}

// Результат: Account(super=BaseEntity(id=1), username=john, email=john@example.com)

3. @EqualsAndHashCode

Что делает: Генерирует методы equals() и hashCode() на основе указанных полей.

Параметры:

  • exclude — поля для исключения.
  • callSuper — вызывать ли методы суперкласса.
  • doNotUseGetters — использовать поля напрямую вместо геттеров.

Пример:

import lombok.EqualsAndHashCode;

@EqualsAndHashCode(exclude = {"id", "createdAt"})
public class Product {
    private Long id;
    private String name;
    private double price;
    private LocalDateTime createdAt;
}

4. @NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor

Что делает: Генерируют конструкторы:

  • @NoArgsConstructor — конструктор без параметров.
  • @AllArgsConstructor — конструктор со всеми параметрами.
  • @RequiredArgsConstructor — конструктор только для final полей и полей с @NonNull.

Параметры:

  • access — уровень доступа конструктора.
  • staticName — имя статического фабричного метода (если задано, конструктор делается private).
  • force (для @NoArgsConstructor) — инициализировать final поля значениями по умолчанию (0, null, false).

Пример:

import lombok.*;

@NoArgsConstructor(force = true)
@AllArgsConstructor(staticName = "of")
@RequiredArgsConstructor
public class Order {
    private final Long id;
    @NonNull private String customerName;
    private double totalAmount;
    private LocalDateTime orderDate;
}

// Использование:
Order order1 = new Order(); // @NoArgsConstructor
Order order2 = Order.of(1L, "John", 100.0, LocalDateTime.now()); // статический фабричный метод
Order order3 = new Order(2L, "Jane"); // @RequiredArgsConstructor — только id и customerName

5. @Data

Что делает: Комбинированная аннотация, которая включает @Getter, @Setter, @ToString, @EqualsAndHashCode и @RequiredArgsConstructor.

Параметры: Наследует параметры всех включённых аннотаций.

Пример:

import lombok.Data;

@Data
public class Book {
    private final String isbn;
    private String title;
    private String author;
    private int year;
}

// Автоматически получаем: геттеры, сеттеры (кроме isbn — final), toString, equals, hashCode, конструктор для isbn

6. @Builder

Что делает: Реализует паттерн "Строитель" (Builder) для класса. Позволяет создавать объекты с помощью цепочечного вызова методов.

Параметры:

  • builderClassName — имя класса-строителя (по умолчанию ИмяКлассаBuilder).
  • buildMethodName — имя метода сборки (по умолчанию build).
  • toBuilder — если true, добавляет метод toBuilder() для создания строителя из существующего объекта.

Пример:

import lombok.Builder;
import lombok.Singular;
import java.util.List;

@Builder
public class Pizza {
    private String size;
    private boolean cheese;
    private boolean pepperoni;
    @Singular
    private List<String> toppings;

    public static void main(String[] args) {
        Pizza pizza = Pizza.builder()
            .size("large")
            .cheese(true)
            .pepperoni(true)
            .topping("mushrooms")
            .topping("olives")
            .build();
    }
}

7. @Value

Что делает: Создаёт неизменяемый (immutable) класс. Все поля делаются private final, генерируются только геттеры (без сеттеров), а также toString(), equals(), hashCode() и конструктор со всеми параметрами.

Параметры: Аналогичны @Data, но без сеттеров.

Пример:

import lombok.Value;

@Value
public class Coordinates {
    double latitude;
    double longitude;
}

// Класс становится неизменяемым: new Coordinates(55.75, 37.62)
// Методы: getLatitude(), getLongitude(), toString(), equals(), hashCode()

8. @Slf4j (и другие логгеры)

Что делает: Автоматически создаёт экземпляр логгера (SLF4J, Log4j, java.util.logging и др.) с именем log.

Варианты: @Slf4j, @Log4j, @Log4j2, @Log, @CommonsLog, @Flogger, @CustomLog.

Пример:

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class PaymentService {
    public void processPayment(double amount) {
        log.info("Processing payment of {}", amount);
        try {
            // логика обработки
        } catch (Exception e) {
            log.error("Payment failed for amount {}", amount, e);
        }
    }
}

// Эквивалентно: private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(PaymentService.class);

9. @NonNull

Что делает: Генерирует проверку на null для параметров методов и конструкторов. Если передан null, выбрасывается NullPointerException с понятным сообщением.

Пример:

import lombok.NonNull;

public class Validator {                    

Рекомендаций