Lombok Builder avec Setter personnalisé

Lombok Builder avec Setter personnalisé

1. introduction

Project Lombok est une bibliothèque Java populaire pour aider à réduire la quantité de code standard qu'un développeur doit écrire.

Dans ce didacticiel, nous allons examiner le fonctionnement de l’annotation@Builder de Lombok et comment nous pouvons la personnaliser en fonction de nos besoins spécifiques.

2. Dépendance Maven

Commençons par ajouterthe dependency à nospom.xml:


    org.projectlombok
    lombok
    1.18.2

3. Annotation LombokBuilder

Avant d'examiner la personnalisation de la classe de générateur générée par Lombok, récapitulons rapidement le fonctionnement de l'annotation Lombok@Builder. Nous avons déjà unintroduction into Lombok’s features. complet

The @Builder annotation can be used to automatically generate a builder for our class. Pour notre exemple, nous utiliserons un système de messagerie dans lequel un utilisateur peut envoyer un message à un autre utilisateur. Le message est soit une simple chaîne de texte, soit unFile. En utilisant Lombok, nous pouvons définir notre classeMessage comme suit:

@Builder
@Data
public class Message {
    private String sender;
    private String recipient;
    private String text;
    private File file;
}

@Data génère tout le passe-partout qui est normalement associé à un simple POJO (Plain Old Java Object): getters pour tous les champs, setters pour tous les champs non finaux, ettoString,equals appropriés et les implémentations dehashCode, et un constructeur.

En utilisant le générateur généré, nous pouvons maintenant générer des instances de notre classeMessage:

Message message = Message.builder()
  .sender("[email protected]")
  .recipient("[email protected]")
  .text("How are you today?")
  .build();

L'annotation@Builder prend également en charge les valeurs par défaut pour les attributs, mais nous n'entrerons pas dans cela maintenant. Il devrait être clair à partir de cet exemple que l'annotation@Builder est assez puissante et peut remplacer beaucoup de code standard.

4. Personnalisation des constructeurs Lombok

La section précédente a montré comment nous pouvons utiliser Lombok pour générer une classe de générateur. Mais il peut arriver que le constructeur généré ne soit pas suffisant. Dans notre exemple, nous avons pour contrainte que le message ne peut contenir que du texte ou un fichier. Il ne peut pas y avoir les deux. Lombok ne le sait pas bien sûr et le constructeur généré nous permettra volontiers d'entrer dans cet état illégal.

Heureusement, nous pouvons résoudre ce problème en personnalisant le constructeur.

La personnalisation d'un générateur Lombok est simple et directe:we write the parts of the builder that we want to customize and the Lombok @Builder annotation will simply not generate those parts. Donc, dans notre exemple, ce serait:

public static class MessageBuilder {
    private String text;
    private File file;

    public MessageBuilder text(String text) {
        this.text = text;
        verifyTextOrFile();
        return this;
    }

    public MessageBuilder file(File file) {
        this.file = file;
        verifyTextOrFile();
        return this;
    }

    private void verifyTextOrFile() {
        if (text != null && file != null) {
            throw new IllegalStateException("Cannot send 'text' and 'file'.");
        }
    }
}

Veuillez noter que nous n'avons pas eu à déclarer les membressender etrecipient, ni les méthodes de générateur qui leur sont associées. Lombok continuera à les générer pour nous.

Si nous essayons de générer une instanceMessage avec à la fois du texte et un fichier avec le code suivant:

Message message = Message.builder()
  .sender("[email protected]")
  .recipient("[email protected]")
  .text("How are you today?")
  .file(new File("/path/to/file"))
  .build();

Il en résultera l'exception suivante:

Exception in thread "main" java.lang.IllegalStateException: Cannot send 'text' and 'file'.

5. Conclusion

Dans cet article rapide, nous avons examiné comment personnaliser le générateur Lombok.

Comme toujours, le code est disponibleover on GitHub.