Lombok Builder mit benutzerdefiniertem Setter

1. Einleitung

Project Lombok ist eine beliebte Java-Bibliothek, mit der Sie die Menge an Code reduzieren können, die ein Entwickler schreiben muss.

In diesem Tutorial sehen wir uns an, wie die @ Builder- Annotation von Lombok funktioniert und wie wir sie an unsere spezifischen Anforderungen anpassen können.

2. Maven-Abhängigkeit

Beginnen wir mit dem Hinzufügen der Abhängigkeit zu unserer pom.xml :

 org.projectlombok lombok 1.18.10 

3. Lombok Builder- Anmerkung

Bevor wir uns mit dem Anpassen der generierten Builder-Klasse von Lombok befassen , lassen Sie uns einen kurzen Rückblick auf die Funktionsweise der Lombok @ Builder- Annotation geben. Wir haben bereits eine vollständige Einführung in die Funktionen von Lombok.

Die Annotation @Builder kann verwendet werden, um automatisch einen Builder für unsere Klasse zu generieren . In unserem Beispiel verwenden wir ein Nachrichtensystem, in dem ein Benutzer eine Nachricht an einen anderen Benutzer senden kann. Die Nachricht ist entweder eine einfache Textzeichenfolge oder eine Datei . Mit Lombok können wir unsere Nachrichtenklasse wie folgt definieren:

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

@Data generiert alle Boilerplates, die normalerweise mit einem einfachen POJO (Plain Old Java Object) verknüpft sind: Getter für alle Felder, Setter für alle nicht endgültigen Felder sowie geeignete für String- , Equal- und HashCode- Implementierungen sowie einen Konstruktor.

Mit dem generierten Builder können wir jetzt Instanzen unserer Message- Klasse generieren :

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

Die Annotation @Builder unterstützt auch Standardwerte für Attribute, aber darauf werden wir jetzt nicht eingehen . Aus diesem Beispiel sollte klar hervorgehen, dass die @ Builder- Annotation sehr leistungsfähig ist und viel Boilerplate-Code ersetzen kann.

4. Anpassen von Lombok Builders

Der vorherige Abschnitt hat gezeigt, wie wir mit Lombok eine Builder-Klasse generieren können. Es kann jedoch Fälle geben, in denen der generierte Builder nicht ausreicht. In unserem Beispiel haben wir die Einschränkung, dass die Nachricht nur Text oder eine Datei enthalten darf. Es kann nicht beides haben. Lombok weiß das natürlich nicht und der generierte Erbauer wird uns gerne erlauben, in diesen illegalen Zustand zu gelangen.

Glücklicherweise können wir dieses Problem beheben, indem wir den Builder anpassen.

Das Anpassen eines Lombok-Builders ist einfach und unkompliziert: Wir schreiben die Teile des Builders, die wir anpassen möchten, und die Lombok @ Builder- Annotation generiert diese Teile einfach nicht . In unserem Beispiel wäre das also:

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'."); } } }

Bitte beachten Sie, dass wir weder die Absender- und Empfängermitglieder noch die damit verbundenen Builder-Methoden deklarieren mussten. Lombok wird diese weiterhin für uns generieren.

Wenn wir versuchen, eine Nachrichteninstanz mit Text und einer Datei mit dem folgenden Code zu generieren:

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

Dies führt zu der folgenden Ausnahme:

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

5. Schlussfolgerung

In diesem kurzen Artikel haben wir uns angesehen, wie Sie den Lombok-Builder anpassen können.

Wie immer ist der Code auf GitHub verfügbar.