Usando a anotação @Builder do Lombok

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

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.