Utilisation de l'annotation @Builder de Lombok

1. Vue d'ensemble

@Builder de Project Lombok est un mécanisme utile pour utiliser le modèle Builder sans écrire de code standard. Nous pouvons appliquer cette annotation à une classe ou à une méthode.

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

2. Dépendances de Maven

Tout d'abord, nous devons ajouter Project Lombok à notre pom.xml :

 org.projectlombok lombok 1.18.10 

Maven Central a la dernière version de Project Lombok ici.

3. Utilisation de @Builder sur une classe

Dans le premier cas d'utilisation, nous implémentons simplement une classe et nous souhaitons 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 fait tout le travail pour nous. Nous pouvons maintenant construire un widget et le tester:

Widget testWidget = Widget.builder() .name("foo") .id(1) .build(); assertThat(testWidget.getName()) .isEqualTo("foo"); assertThat(testWidget.getId()) .isEqualTo(1);

Si nous voulons créer des copies ou des quasi-copies d'objets, nous pouvons ajouter la propriété toBuilder = true à l' annotation @Builder :

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

Cela indique à Lombok d'ajouter une méthode toBuilder () à notre classe . Lorsque nous invoquons la méthode toBuilder () , elle retourne un générateur initialisé avec les propriétés de l'instance sur laquelle il est appelé:

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 et construire () une nouvelle instance.

Si nous devons spécifier les champs obligatoires, nous pouvons utiliser la configuration d'annotation pour créer un générateur auxiliaire:

@Builder(builderMethodName = "internalBuilder") public class RequiredFieldAnnotation { @NonNull private String name; private String description; public static RequiredFieldAnnotationBuilder builder(String name) { return internalBuilder().name(name); } }

Dans ce cas, nous masquons le constructeur par défaut en tant que internalBuilder et créons le nôtre. Ainsi, lorsque nous créons le constructeur, nous devons fournir le paramètre requis:

RequiredField.builder("NameField").description("Field Description").build();

De plus, pour nous assurer que notre champ existe, nous pouvons ajouter l' annotation @NonNull .

4. Utilisation de @Builder sur une méthode

Supposons que nous utilisons un objet que nous voulons construire avec un générateur, mais que nous ne pouvons pas modifier la source ou étendre la classe .

Tout d'abord, créons un exemple rapide en utilisant l'annotation @Value de Lombok:

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

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

Nous avons expliqué comment utiliser @Builder sur une classe , mais nous pouvons également l'utiliser sur des méthodes. Nous allons utiliser cette capacité pour contourner l'impossibilité de modifier ou d'étendre ImmutableClient .

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ée builder () qui renvoie un Builder pour créer des ImmutableClients .

Maintenant, construisons un ImmutableClient :

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 une classe finale , et nous avons vu comment rendre certains des champs de classe obligatoires.

Des exemples de code, comme toujours, peuvent être trouvés sur GitHub.