Lombok @Builder initialisiert keine Sammlungen

Lesezeit: 3 Minuten

Benutzeravatar von marstran
marstran

Ich verwende Lomboks @Data Und @Builder Anmerkungen wie diese:

@Data
@Builder(toBuilder = true)
class Movie {

    // Some other fields here.

    private final List<Actor> actors;

}

Wenn ich ein neues erstelle Movie Wenn ich den Builder verwende, ohne irgendwelche Akteure anzugeben, würde ich erwarten, dass Lombok meine Liste initialisiert Collections.emptyList(). Aber das passiert nicht:

List<Actor> actors = Movie.builder().build().getActors();
System.out.println(actors); // Prints 'null'.

In der Dokumentation zum @Builder Anmerkung, es wird in Zeile 55 und 56 im Codebeispiel für Vanilla Java angegeben (https://projectlombok.org/features/Builder.html), für die ich mir das Codebeispiel ansehen sollte @Singular (https://projectlombok.org/features/Singular-snippet.html). In Zeile 112 im Vanilla-Java-Beispiel hier scheint es, als ob die Liste mit der leeren Liste initialisiert werden sollte.

Ich habe es überprüft und es passiert tatsächlich, wenn ich die Liste mit kommentiere @Singular:

@Data
@Builder(toBuilder = true)
class Movie {

    // Some other fields here.

    @Singular
    private final List<Actor> actors;

}

List<Actor> actors = Movie.builder().build().getActors();
System.out.println(actors); // Prints '[]'.

Ist das ein Fehler in Lombok oder mache ich etwas falsch? Der Dokumentation zufolge scheint es, als ob die Liste in beiden Fällen mit der leeren Liste initialisiert werden sollte (da die @Builder doc bezieht sich auf die @Singular doc).

  • Ich verwende übrigens die Lombok-Version 1.16.6.

    – marstran

    28. September 2015 um 13:55 Uhr

Nur wenn Sie es verwenden @Singular, erhalten Sie eine leere Liste. Auf der Builder-Dokumentationsseite es sagt:

…mit dem @Singular Anmerkung: Lombok behandelt diesen Builder-Knoten als Sammlung.

Ohne das @Singular, Lombok behandelt es wie jedes andere Objekt. So wird es sein null anstelle einer leeren Sammlung.

Offenlegung: Ich bin ein Lombok-Entwickler

  • Danke! Übrigens, die @Singular Annotation gibt einen Fehler aus, wenn der Variablenname der Sammlung nicht singularisiert werden kann. Dies ist jedoch etwas umständlich, wenn Sie ein nicht zählbares Substantiv als Variablennamen haben (z. B. das Wort „Ausrüstung“ oder „Schaf“). Warum kann die generierte Singular-Methode nicht den gleichen Namen wie die Plural-Methode haben, anstatt einen Kompilierungsfehler auszugeben?

    – marstran

    30. September 2015 um 6:49

  • Unsere kurze Recherche lässt uns glauben, dass in tatsächlicher Software nicht viele dieser Wörter vorkommen. Wenn Lombok unsicher ist, sind wir auf der sicheren Seite. Ist das nicht eine Warnung?

    – Roel Spilker

    1. Okt. 2015 um 11:18

  • Mir wurde klar, dass ich den Namen einfach so angeben kann @Singular("equipment"), und es hat funktioniert. Vielen Dank für Ihre Hilfe!

    – marstran

    1. Okt. 2015 um 11:37 Uhr

  • Oder Sie können verwenden @Builder.Default Anmerkung hinzufügen und die Datei selbst initialisieren.

    – Ondřej Stašek

    20. März 2019 um 9:34

  • Ich habe versucht, @Singular zu verwenden, aber meine Liste ist immer noch null und keine leere Liste …

    – Falsch

    27. August 2019 um 7:14 Uhr

Seit Lombok v1.16.16 können Sie die innere Annotation von @Builder verwenden, um Ihre Sammlung standardmäßig zu initialisieren. Zum Beispiel:

@Data
@Builder
class Movie {

@Builder.Default
private final List<Actor> actors = new ArrayList<>();

}

Wenn Sie also mit dem Builder einen neuen Film erstellen, ohne Schauspieler anzugeben:

Movie movie = Movie.builder().build();
movie.getActors(); // Will return instance of ArrayList

  • Das hat bei mir funktioniert (w Lombok v. 1.18.12). Für mich war dies die bessere Antwort, da dies genau das Problem löst (wie OP), ohne dass dies erforderlich ist @Singular Anmerkung, die andere verändert @Builder Verhalten, das ich nicht wollte.

    – Wardibald

    22. April 2021 um 8:23

  • Ohne das final Modifizierer, dadurch wird der Standardwert für den Konstruktoraufruf entfernt und kann zu NPE führen.

    – Valerij Dobler

    19. September 2022 um 7:20 Uhr


1452520cookie-checkLombok @Builder initialisiert keine Sammlungen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy