Использование аннотации @Builder от Lombok

Использование аннотации @Builder от Lombok

1. обзор

@Builder в Project Lombok - полезный механизм для использованияBuilder pattern без написания стандартного кода. Мы можем применить эту аннотацию кClass или к методу.

В этом кратком руководстве мы рассмотрим различные варианты использования@Builder.

2. Maven Зависимости

Во-первых, нам нужно добавитьProject Lombok к нашемуpom.xml:


    org.projectlombok
    lombok
    1.16.20.0

Maven Central имеетlatest version of Project Lombok here.

3. Использование@Builder в классе

В первом случае мы просто реализуемClass и хотим использовать конструктор для создания экземпляров нашего класса.

Первый и единственный шаг - добавить аннотацию к объявлению класса:

@Getter
@Builder
public class Widget {
    private final String name;
    private final int id;
}

Lombok does all of the work for us. Теперь мы можем построитьWidget и протестировать его:

Widget testWidget = Widget.builder()
  .name("foo")
  .id(1)
  .build();

assertThat(testWidget.getName())
  .isEqualTo("foo");
assertThat(testWidget.getId())
  .isEqualTo(1);

If we want to create copies or near-copies of objects, we can add the property toBuilder = true to the @Builder annotation:

@Builder(toBuilder = true)
public class Widget {
//...
}

Это говорит Lombok добавить методtoBuilder() к нашемуClass. Когда мы вызываем методtoBuilder(), онreturns a builder initialized with the properties of the instance it is called on:

Widget testWidget = Widget.builder()
  .name("foo")
  .id(1)
  .build();

Widget.WidgetBuilder widgetBuilder = testWidget.toBuilder();

Widget newWidget = widgetBuilder.id(2).build();
assertThat(newWidget.getName())
  .isEqualTo("foo");
assertThat(newWidget.getId())
  .isEqualTo(2);

В тестовом коде мы видим, что класс построителя, сгенерированный Lombok, назван так же, как наш класс, с добавленным к нему“Builder” - в данном случаеWidgetBuilder. Затем мы можем изменить желаемые свойства и создатьbuild() новый экземпляр.

4. Использование@Builder в методе

Предположим, мы используем объект, который хотим построить с помощью строителя, но мыcan’t modify the source or extend the*Class*.

Во-первых, давайте создадим быстрый пример, используяLombok’s @Value annotation:

@Value
final class ImmutableClient {
    private int id;
    private String name;
}

Теперь у нас естьfinalClass с двумя неизменяемыми членами, геттерами для них и конструктором всех аргументов.

We covered how to use @Builder on a Class, but we can use it on methods, too. Мы будем использовать эту возможность, чтобы обойти невозможность изменить или расширитьImmutableClient.

Далее мы создадим новый класс с методом создания ImmutableClients:

class ClientBuilder {

    @Builder(builderMethodName = "builder")
    public static ImmutableClient newClient(int id, String name) {
        return new ImmutableClient(id, name);
    }
}

Эта аннотация создает метод с именемbuilder(), которыйreturns a Builder for creating ImmutableClients.

Теперь мы можем построитьImmutableClient:

ImmutableClient testImmutableClient = ClientBuilder.builder()
  .name("foo")
  .id(1)
  .build();
assertThat(testImmutableClient.getName())
  .isEqualTo("foo");
assertThat(testImmutableClient.getId())
  .isEqualTo(1);

5. Заключение

В этой статье мы использовали аннотацию Lombok@Builder для метода создания компоновщика дляfinalClass.

Примеры кода, как всегда, можно найтиover on GitHub.