Usando a anotação @Builder do Lombok
1. Visão geral
O@Builder do Lombok do projeto é um mecanismo útil para usar oBuilder pattern sem escrever código clichê. Podemos aplicar essa anotação aClass ou método.
Neste breve tutorial, veremos os diferentes casos de uso para@Builder.
2. Dependências do Maven
Primeiro, precisamos adicionarProject Lombok ao nossopom.xml:
org.projectlombok
lombok
1.16.20.0
Maven Central tem olatest version of Project Lombok here.
3. Usando@Builder em uma classe
No primeiro caso de uso, estamos simplesmente implementando umClass e queremos usar um construtor para criar instâncias de nossa classe.
A primeira e única etapa é adicionar a anotação à declaração de classe:
@Getter
@Builder
public class Widget {
private final String name;
private final int id;
}
Lombok does all of the work for us. Agora podemos construir umWidgete testá-lo:
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 {
//...
}
Isso informa ao Lombok para adicionar um métodotoBuilder() ao nossoClass. Quando invocamos o métodotoBuilder(), é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);
Podemos ver no código de teste que a classe do construtor gerada pelo Lombok é nomeada como nossa classe, com“Builder” anexado a ela -WidgetBuilder neste caso. Podemos então modificar as propriedades que desejamos ebuild() uma nova instância.
4. Usando@Builder em um método
Suponha que estejamos usando um objeto que queremos construir com um construtor, mas nóscan’t modify the source or extend the*Class*.
Primeiro, vamos criar um exemplo rápido usandoLombok’s @Value annotation:
@Value
final class ImmutableClient {
private int id;
private String name;
}
Agora temos umfinalClass com dois membros imutáveis, getters para eles e um construtor de todos os argumentos.
We covered how to use @Builder on a Class, but we can use it on methods, too. Usaremos esta capacidade para contornar a impossibilidade de modificar ou estenderImmutableClient.
A seguir, criaremos uma nova classe com um método para criar ImmutableClients:
class ClientBuilder {
@Builder(builderMethodName = "builder")
public static ImmutableClient newClient(int id, String name) {
return new ImmutableClient(id, name);
}
}
Esta anotação cria um método denominadobuilder() quereturns a Builder for creating ImmutableClients.
Agora podemos construir umImmutableClient:
ImmutableClient testImmutableClient = ClientBuilder.builder()
.name("foo")
.id(1)
.build();
assertThat(testImmutableClient.getName())
.isEqualTo("foo");
assertThat(testImmutableClient.getId())
.isEqualTo(1);
5. Conclusão
Neste artigo, usamos a anotação@Builder do Lombok em um método para criar um construtor para umfinalClass.
Amostras de código, como sempre, podem ser encontradasover on GitHub.