← Назад к вопросам

Какие плюсы и минусы @Builder?

1.8 Middle🔥 111 комментариев
#Другое

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

@Builder из Lombok — плюсы и минусы

@Builder — это аннотация из библиотеки Lombok, которая автоматически генерирует паттерн Builder для создания объектов. Это делает создание объектов более удобным и читаемым, особенно когда у класса много полей.

Что генерирует @Builder

аннотация создаёт статический класс-builder с методами для установки каждого поля и методом build() для создания финального объекта.

Пример

import lombok.Builder;
import lombok.Getter;

@Getter
@Builder
public class User {
    private Long id;
    private String name;
    private String email;
    private int age;
    private String phone;
}

// После компиляции Lombok генерирует примерно такой код:
public class User {
    private Long id;
    private String name;
    private String email;
    private int age;
    private String phone;

    public static UserBuilder builder() {
        return new UserBuilder();
    }

    public static class UserBuilder {
        private Long id;
        private String name;
        private String email;
        private int age;
        private String phone;

        public UserBuilder id(Long id) {
            this.id = id;
            return this;
        }
        public UserBuilder name(String name) {
            this.name = name;
            return this;
        }
        public UserBuilder email(String email) {
            this.email = email;
            return this;
        }
        public UserBuilder age(int age) {
            this.age = age;
            return this;
        }
        public UserBuilder phone(String phone) {
            this.phone = phone;
            return this;
        }

        public User build() {
            return new User(id, name, email, age, phone);
        }
    }
}

Использование

// Создание объекта через builder
User user = User.builder()
    .id(1L)
    .name("Alice")
    .email("alice@example.com")
    .age(28)
    .phone("+1-555-0123")
    .build();

// Можно не устанавливать все поля
User user2 = User.builder()
    .name("Bob")
    .email("bob@example.com")
    .build();

Плюсы @Builder

1. Улучшенная читаемость

Вместо конструктора с множеством параметров:

// Плохо — непонятно, что это за значения
User user = new User(1L, "Alice", "alice@example.com", 28, "+1-555-0123");

Получаем понятный код:

// Хорошо — видно названия полей
User user = User.builder()
    .id(1L)
    .name("Alice")
    .email("alice@example.com")
    .age(28)
    .phone("+1-555-0123")
    .build();

2. Гибкость при создании объектов

Можно устанавливать только нужные поля:

User minimal = User.builder().name("John").build();

3. Избавляет от написания кода вручную

Lombok автоматически генерирует all-args конструктор, getters, setters. Экономит время.

4. Удобно при рефакторинге

Если добавить новое поле в класс, не нужно обновлять все места, где создаётся объект. Builder автоматически будет иметь новый метод.

5. Неизменяемость (immutability)

@Getter
@Builder
public class ImmutableUser {
    private final Long id;
    private final String name;
}

Лучше всего использовать builder с final полями — это создаёт потокобезопасные объекты.

Минусы @Builder

1. Зависимость от Lombok

Лombok — это внешняя библиотека, требует специальной конфигурации IDE и build-инструмента. Не все проекты хотят добавлять эту зависимость.

<!-- нужно добавить в pom.xml -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.30</version>
    <scope>provided</scope>
</dependency>

2. IDE может не распознать сгенерированный код

Если Lombok не подключён в IDE, автозаполнение и проверка типов могут не работать.

3. Генерирует лишний код в памяти

Внутренний класс-builder занимает дополнительную память. Для простых объектов это незначительно, но для множества классов может накопиться.

4. Может скрывать проблемы валидации

@Builder
public class User {
    private String email;
}

// Можно создать некорректный объект
User invalid = User.builder()
    .email("not-an-email") // валидация не будет проведена
    .build();

Исправление требует использования методов-ловушек:

@Builder
public class User {
    private String email;
    
    public User(String email) {
        if (!email.contains("@")) {
            throw new IllegalArgumentException("Invalid email");
        }
        this.email = email;
    }
}

5. Излишне для простых объектов

// Для объекта с одним полем builder может быть избыточен
@Builder
public class Id {
    private Long value;
}

// Проще использовать конструктор
Id id = new Id(1L);

6. Генерирует all-args конструктор по умолчанию

Это может привести к нежелательным способам создания объекта, если builder используется как главный способ.

Когда использовать @Builder

Используй, когда:

  • Объект имеет 3+ поля
  • Не все поля обязательны
  • Часто создаёшь объекты с разными комбинациями полей
  • Хочешь улучшить читаемость кода
  • Работаешь с DTO (Data Transfer Objects)

Не используй, когда:

  • Объект имеет 1-2 поля
  • Все поля обязательны и всегда устанавливаются
  • Проект избегает Lombok
  • Нужна сложная валидация при создании

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

// 1. Вместо @Builder можно использовать конструктор
public User(Long id, String name, String email) { ... }

// 2. Использовать setter-ы (менее рекомендуется)
User user = new User();
user.setName("Alice");
user.setEmail("alice@example.com");

// 3. Java records (Java 16+) — если не нужна гибкость
public record User(Long id, String name, String email) {}

В современном Java часто используют records вместо классов с @Builder, особенно для DTO.