Подробное объяснение использования аннотации lombok @Builder в Java.

Project Lombok

Авторские права принадлежат автору Для любой формы перепечатки, пожалуйста, свяжитесь с автором для получения разрешения и укажите источник.

Введение

LombokВсе мы знаем, что в процессе использования POJO это приносит нам много удобства, экономя много времени при написании методов get, set, конструкторов, методов equal и toString. Кроме того, с помощью аннотации @Builder ломбок также может упростить шаблон построителя времени.

Просто определите статический общедоступный внутренний класс. Пример кода выглядит следующим образом:

public class User {
    private Integer id;
    private String name;
    private String address;

    private User() {
    }

    private User(User origin) {
        this.id = origin.id;
        this.name = origin.name;
        this.address = origin.address;
    }

    public static class Builder {
        private User target;

        public Builder() {
            this.target = new User();
        }

        public Builder id(Integer id) {
            target.id = id;
            return this;
        }

        public Builder name(String name) {
            target.name = name;
            return this;
        }

        public Builder address(String address) {
            target.address = address;
            return this;
        }

        public User build() {
            return new User(target);
        }
    }

Если в проекте используется ломбок, вы можете напрямую использовать аннотацию @Builder для достижения

Измените приведенный выше класс следующим образом:

import lombok.Builder;
import lombok.ToString;

/**
 * @author wulongtao
 */
@ToString
@Builder
public class UserExample {
    private Integer id;
    private String name;
    private String address;
}

как пользоваться:

UserExample userExample = UserExample.builder()
                .id(1)
                .name("aaa")
                .address("bbb")
                .build();

System.out.println(userExample);

Столкнуться с проблемами

В процессе использования @Builder обнаружилась проблема: объект Builder подкласса не имеет свойств родительского класса. Это вызывало определенные проблемы в использовании.

Для этой проблемы было найдено следующее решение

  1. Для родительского класса используйте аннотацию @AllArgsConstructor.
  2. Для подклассов напишите конструктор с полными параметрами вручную, вызовите конструктор с полными параметрами родительского класса внутри и используйте аннотацию @Builder в конструкторе с полными параметрами подкласса.

Таким образом, объект Builder подкласса может использовать все частные свойства суперкласса.
Но это решение также имеет два побочных эффекта:

  • потому что использовать@AllArgsConstructorОбратите внимание, порядок полей конструктора родительского класса определяется порядком объявленных полей.Если конструктор подкласса передает параметры в непоследовательном порядке, а типы полей все те же, найти ошибки будет сложно.
  • Если поле родительского класса увеличивается или уменьшается, конструкторы всех подклассов должны быть изменены

Хотя есть эти два побочных эффекта, это решение — единственный найденный мной способ решить проблему использования @Builder для подклассов, которые могут использовать свойства родительского класса.

Справочные комментарии в блоге:Аннотация и наследование Lombok @Builder

Как добавить значение поля по умолчанию в схему с помощью @Builder. Поскольку используется шаблон построителя, обычно недопустимо указывать значение поля по умолчанию при объявлении поля в классе, и вам нужно что-то делать с построителем.

  1. Настройте статический внутренний класс в качестве построителя, задайте значение по умолчанию, а затем используйте аннотацию @Builder.В это время ломбок завершит существующий класс построителя и будет использовать значение по умолчанию.
  2. Обновленный ломбок имеет объявление @Builder.Default, которое можно аннотировать в полях, требующих значений по умолчанию.

В комментариях также есть обсуждение побочных эффектов этого метода. Ссылка:Использование аннотации Lombok @Builder со значениями по умолчанию