web-dev-qa-db-fra.com

Sonar - Stocker une copie - Les membres mutables ne doivent pas être stockés ou retournés directement

J'ai une liste qui est un membre privé de ma classe. J'ai utilisé Getter et Setter pour obtenir et définir les valeurs. Sonar jette une erreur - les membres mutables ne doivent pas être stockés ou retournés directement.

Par exemple: ABC et DEF sont deux classes.

class ABC{
private List<DEF> defList;
public List<DEF> getDefList() { return defList; }
public void setDefList(List<DEF> defList) { this.defList = defList; }

Après beaucoup de googling et de recherche, j'ai compris que le getter peut être changé comme suit:

public List<DEF> getDefList() { return new ArrayList<>(defList); }

Quand j'essaie d'utiliser un setter de la même manière,

public void setDefList(List<DEF> defList) { this.defList.addAll(defList); }

puis la variable commence à montrer

'private field 'defList' is never assigned.

Puis-je connaître la bonne façon de faire quand il s'agit d'une liste (une liste d'une autre classe)

Remarque: les réponses de Prasad Karunagoda et de Leo ASO fonctionne. Je ne peux pas marquer à la fois comme réponse acceptée. Alors avoir une note ici

8
pgman

Je crois qu'il vaut mieux ne pas ajouter de restrictions supplémentaires (immutabilité) au List renvoyé du getter. Si vous faites cela, les clients utilisant votre List ne seront pas en mesure de le trier par exemple.

Donc, mon approche recommandée est la suivante:

public class ABC {
  private List<DEF> defList = new ArrayList<>();

  public List<DEF> getDefList() {
    return new ArrayList<>(defList);
  }

  public void setDefList(List<DEF> defList) {
    if (defList == null)
        throw new IllegalArgumentException("Parameter defList is null");
    this.defList.clear();
    this.defList.addAll(defList);
  }
}

Du point de vue du design, une API encore meilleure pour ABC classe serait:

public List<DEF> getDefList()
public void clearDefList()
public void addAllDefs(List<DEF> defs) // Or method name appendDefs
1
Prasad Karunagoda