Что такое 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 { Также в библиотеке
Логирование в Go (Golang): лучшие библиотеки и решения 2024
Java Image I/O API: resize и crop изображений | Руководство
Работа с JWT токенами в TypeScript: библиотека jsonwebtoken и полное руководство
polars для Rust: полное руководство с примерами