2016-07-22 36 views
4

Ich ersetze gerade alle meine Standard-POJOs, um Lombok für alle Boilerplate-Codes zu verwenden. Ich finde, dass ich Getter für Listen halte, weil ich eine leere Liste zurückgeben möchte, wenn die Liste nicht initialisiert wurde. Das heißt, ich möchte nicht, dass der Getter null zurückgibt. Wenn mir eine Lombok-Magie, die mir nicht bewusst ist, helfen kann, dies zu vermeiden?Liste initialisieren, wenn die Liste mit Lombok Getter null ist?

Beispiel des generierten Codes

private List<Object> list; 
public Object getList(){ return list; } 

Was würde ich stattdessen mag:

private List<Object> list; 
public Object getList(){ 
    if (list == null) { 
     return new ArrayList(); 
    } 
    return list; 
} 
+4

Warum initialisierst du die Liste nicht einfach? –

+2

_ "Wenn die Liste nicht initialisiert wurde" _ würde ich das als Fehler betrachten. Wenn Sie aus irgendeinem Grund faule Initialisierung benötigen, können Sie sich die Dokumentation ansehen - es ist unmöglich, '@Getter (faul = true)' zu verpassen. Übrigens ist der erforderliche Code derselbe wie für das erstmalige Initialisieren der Liste. – zeroflagL

Antwort

5

Sie können dies erreichen, indem er erklärt, und die Felder zu initialisieren. Die Initialisierung wird ausgeführt, wenn das umschließende Objekt initialisiert wird.

private List<Object> list = new ArrayList(); 

Lomboks @Getter Annotation stellt ein Attribut lazy die verzögerte Initialisierung ermöglicht.

@Getter(lazy=true) private final double[] cached = expensiveInitMethod(); 

Documentation

+1

_ "Lombok unterstützt das Initialisieren beim Lesen nicht" _ Eigentlich tut es das. – zeroflagL

+1

@zeroflagL Danke, ich habe das nie benutzt, weil es mit '@Data' nicht möglich ist, aber der Java-Weg ist. – stacker

2

Das heißt, ich will nicht der Getter null zurückzukehren. Wenn mir eine Lombok-Magie, die mir nicht bewusst ist, helfen kann, dies zu vermeiden?

Sie brauchen keine Magie, um passieren zu können. Initialisieren Sie einfach die list.

0

Sie können den Getter mit allem, was Sie möchten, überschreiben, indem Sie AccessLevel.NONE auf dem Feld verwenden.

Beachten Sie, dass lediglich das Initialisieren des Felds Sie nicht vor Clients schützt, die einen Konstruktor mit Nullen aufrufen, oder wenn Sie einen Setter mit Null aufrufen (immer noch in Ordnung, je nachdem, was Sie wollen).

z.

@Getter(AccessLevel.NONE) 
private Map<String, String> params; 

public Map<String, String> getParams() { 
    return (params == null) ? Collections.emptyMap() : params; 
} 
2

Ich hatte die gleichen Fragen wie dieser. Obwohl die obigen Antworten in mancher Hinsicht nützlich sind, ist die genaue Lösung, @Builder und Annotationen von Lombok API wie unten angegebenen Code zu verwenden.

Es funktionierte hervorragend für mich.

Dies initialisiert myList mit einem Nicht-Null-List-Objekt. Obwohl diese Fragen alt sind. Aber, immer noch diese Antwort posten, um jemanden wie mich zu helfen, der diese Frage in Zukunft beziehen wird.