Lombok Builder mit benutzerdefiniertem Setter

Lombok Builder mit benutzerdefiniertem Setter

1. Einführung

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-Anmerkung von Lombok funktioniert und wie wir sie an unsere spezifischen Anforderungen anpassen können.

2. Maven-Abhängigkeit

Beginnen wir mit dem Hinzufügen vonthe dependency zu unserenpom.xml:


    org.projectlombok
    lombok
    1.18.2

3. LombokBuilder 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 Annotation von Lombok@Buildergeben. Wir haben bereits volleintroduction into Lombok’s features.

The @Builder annotation can be used to automatically generate a builder for our class. 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 einFile. Mit Lombok können wir unsereMessage-Klasse wie folgt definieren:

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

@Data generiert die gesamte Boilerplate, die normalerweise einem einfachen POJO (Plain Old Java Object) zugeordnet ist: Getter für alle Felder, Setter für alle nicht endgültigen Felder und geeignetetoString,equals undhashCode Implementierungen und ein Konstruktor.

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

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

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

4. Anpassen von Lombok Builders

Der vorherige Abschnitt zeigte, wie wir Lombok verwenden können, um eine Builder-Klasse zu generieren. 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 kann. 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:we write the parts of the builder that we want to customize and the Lombok @Builder annotation will simply not generate those parts. 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 die Mitgliedersender undrecipient oder die damit verbundenen Builder-Methoden nicht deklarieren mussten. Lombok wird diese weiterhin für uns generieren.

Wenn wir versuchen, eineMessage-Instanz sowohl mit Text als auch mit 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();

Es wird die folgende Ausnahme zur Folge haben:

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

5. Fazit

In diesem kurzen Artikel haben wir uns mit dem Anpassen des Lombok-Builders befasst.

Wie immer ist der Codeover on GitHub verfügbar.