web-dev-qa-db-fra.com

Initialiser la liste si la liste est nulle avec lombok getter?

Je remplace actuellement tous mes POJO standard pour utiliser Lombok pour tout le code passe-partout. Je me retrouve à garder des getters pour les listes car je veux retourner une liste vide si la liste n'a pas été initialisée. Autrement dit, je ne veux pas que le getter renvoie null. S'il y a de la magie lombok que je ne connais pas qui peut m'aider à éviter de faire ça?

Exemple de code généré

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

Ce que je voudrais plutôt:

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

Vous pouvez y parvenir en déclarant et en initialisant les champs. L'initialisation sera effectuée lors de l'initialisation de l'objet englobant.

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

Lomboks @Getter l'annotation fournit un attribut lazy qui permet une initialisation paresseuse.

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

Documentation

11
stacker

J'avais les mêmes questions que celle-ci. Bien que les réponses ci-dessus soient utiles à certains égards, la solution exacte consiste à utiliser @Builder et @Singular annotations de l'API Lombok comme ci-dessous le code donné.

Cela a fonctionné superbe pour moi.

@Builder
class MyClass{
    @Singular
    private List<Type> myList;
}

Cela initialisera myList avec un objet List non nul. Cependant, cette question est ancienne. Mais, toujours poster cette réponse pour aider quelqu'un comme moi qui référera cette question à l'avenir.

7
ACloudRoamer

Autrement dit, je ne veux pas que le getter renvoie null. S'il y a de la magie lombok que je ne connais pas qui peut m'aider à éviter de faire ça?

Vous n'avez besoin d'aucune magie pour arriver. Initialisez simplement le list.

2
Jude Niroshan

Vous pouvez remplacer le getter avec tout ce que vous aimez en utilisant AccessLevel.NONE sur le terrain.

Notez que la simple initialisation du champ ne vous protège pas des clients appelant un constructeur avec null ou appelant un setter avec null (cela peut toujours être correct, selon ce que vous voulez).

Par exemple.

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

public Map<String, String> getParams() {
    return (params == null) ? new HashMap<>() : params;
}
1
tkruse