Как использовать аннотацию @Builder из проекта Lombok?

«Как использовать аннотацию @Builder из проекта Lombok?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Базовый пример:

import lombok.Builder;
import lombok.ToString;

@Builder
@ToString
public class User {
    private final Long id; // final поле
    private String name;
    private String email;
    private int age;
}

// Использование:
User user = User.builder()
    .id(1L)
    .name("Alice")
    .email("alice@example.com")
    .age(30)
    .build();

Расширенные возможности:

  1. @Builder на методе: Позволяет создать билдер для конкретного конструктора или фабричного метода.

    public class Car {
        private String model;
        private int year;
    
        @Builder
        public static Car createCar(String model, int year) {
            Car car = new Car();
            car.model = model;
            car.year = year;
            return car;
        }
    }
    // Использование: Car car = Car.createCarBuilder().model("Tesla").year(2023).build();
  2. Кастомизация имен методов:
    @Builder(builderMethodName = "newBuilder", buildMethodName = "create")
  3. Наследование: Для классов с иерархией используйте @SuperBuilder.

    @SuperBuilder
    public class Parent { private String parentField; }
    
    @SuperBuilder
    public class Child extends Parent { private String childField; }
    // Child child = Child.builder().parentField("A").childField("B").build();

Преимущества:

  • Неизменяемость: Позволяет создавать immutable-объекты, если все поля final.
  • Читаемость: Цепочка вызовов делает код создания объекта наглядным.
  • Безопасность: Исключает ошибки, связанные с неправильным порядком аргументов конструктора.

Ограничение: Нельзя использовать @Builder вместе с @Data или @Value без явного определения всех полей в конструкторе.