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