Utilisation de l’annotation @Builder de Lombok

Utiliser l'annotation @Builder de Lombok

1. Vue d'ensemble

Les@Builder du projet Lombok sont un mécanisme utile pour utiliser lesBuilder pattern sans écrire de code standard. Nous pouvons appliquer cette annotation à unClass ou à une méthode.

Dans ce bref didacticiel, nous examinerons les différents cas d'utilisation de@Builder.

2. Dépendances Maven

Tout d'abord, nous devons ajouterProject Lombok à nospom.xml:


    org.projectlombok
    lombok
    1.16.20.0

3. Utilisation de@Builder sur une classe

Dans le premier cas d'utilisation, nous implémentons simplement unClass, et nous voulons utiliser un générateur pour créer des instances de notre classe.

La première et unique étape consiste à ajouter l'annotation à la déclaration de classe:

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

Lombok does all of the work for us. Nous pouvons maintenant construire unWidget et le tester:

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 {
//...
}

Cela indique à Lombok d'ajouter une méthodetoBuilder() à nosClass. Lorsque nous invoquons la méthodetoBuilder(), ellereturns 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);

Nous pouvons voir dans le code de test que la classe de générateur générée par Lombok est nommée comme notre classe, avec“Builder” en plus -WidgetBuilder dans ce cas. Nous pouvons alors modifier les propriétés que nous souhaitons etbuild() une nouvelle instance.

4. Utilisation de@Builder sur une méthode

Supposons que nous utilisions un objet que nous voulons construire avec un générateur, mais que nouscan’t modify the source or extend the*Class*.

Commençons par créer un exemple rapide en utilisantLombok’s @Value annotation:

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

Nous avons maintenant unfinalClass avec deux membres immuables, des getters pour eux et un constructeur tous arguments.

We covered how to use @Builder on a Class, but we can use it on methods, too. Nous utiliserons cette capacité pour contourner l'impossibilité de modifier ou d'étendreImmutableClient.

Ensuite, nous allons créer une nouvelle classe avec une méthode pour créer des ImmutableClients:

class ClientBuilder {

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

Cette annotation crée une méthode nomméebuilder() quereturns a Builder for creating ImmutableClients.

Maintenant, nous pouvons construire unImmutableClient:

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

5. Conclusion

Dans cet article, nous avons utilisé l'annotation@Builder de Lombok sur une méthode pour créer un générateur pour unfinalClass.

Des échantillons de code, comme toujours, peuvent être trouvésover on GitHub.