Использование аннотации @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.