web-dev-qa-db-fra.com

Getters et Setters pour ArrayLists dans Java

Comment pourrais-je utiliser des getters et setters pour une ArrayList en Java? Voici ce que j'ai. Je pense que j'utilise correctement le getter, mais je ne sais pas comment utiliser un setter pour une ArrayList.

private ArrayList<String> stringlist = new ArrayList<String>();
public ArrayList<String> getStringList() {
    return stringlist;
}

public ArrayList<String> setStringList() {
    // I don't know what to put here
    // I also don't know if my return value is correct
}
6
user5340035

Pour définir la valeur, vous devez prendre un ArrayList<String> passé en paramètre, et vous définiriez simplement ArrayList sur le paramètre.

Notez également l'utilisation de void plutôt que de ArrayList<String> indiqué dans votre question. Généralement, une méthode setter ne renvoie rien.

public void setStringList(ArrayList<String> stringList)
{
    this.stringList = stringList;
}
4
user5000849

ArrayList est une classe de conteneur modifiable, donc vous n'avez pas du tout besoin d'un setter: demandez simplement aux appelants d'appeler getStringList() puis de muter eux-mêmes le ArrayList:

public final class DataHolder {
  private final ArrayList<String> stringList = new ArrayList<>();

  public ArrayList<String> getStringList() {
    return stringList;
  }
}

public static void main(String[] args) {
  DataHolder data = new DataHolder();
  data.getStringList().add("foo");
}

D'un autre côté, l'exigence la plus courante consiste à empêcher les appelants de pouvoir muter les structures de données internes, afin que votre classe puisse réellement appliquer ses invariants sur ses données. ArrayList est toujours modifiable, donc si vous devez retourner un ArrayList mais que vous ne voulez pas que votre état privé soit modifié, vous devrez copier:

public ArrayList<String> getStringList() {
  return new ArrayList<String>(stringList);
}

Alternativement, si possible, il est préférable d'élargir le type de retour, puis de renvoyer une autre implémentation que votre classe peut utiliser pour appliquer ses invariants. Par exemple, si vous ne voulez pas que les gens modifient votre ArrayList à l'aide d'une méthode getter, vous pouvez élargir le type de ArrayList<String> à List<String> et utiliser une implémentation non modifiable, par exemple:

public List<String> getStringList() {
  return Collections.unmodifiableList(stringList);
}

En revanche, pour le setter, cela dépend de la façon dont vous voulez gérer les valeurs. Normalement, une méthode setFoo remplace le contenu de foo, ce que vous pouvez bien sûr faire:

public void setStringList(ArrayList<String> stringList) {
  this.stringList = stringList;
}

Mais très probablement, vous souhaitez également élargir le type que vous accepterez. Par exemple, vous pouvez accepter n'importe quel Collection au lieu d'un ArrayList:

public void setStringList(Collection<String> strings) {
  this.stringList = new ArrayList<>(strings);
}

Il peut être plus utile, cependant, d'exposer à la place des méthodes pour muter la liste sous-jacente d'autres manières. Par exemple, vous souhaitez peut-être simplement prendre en charge l'ajout de nouveaux éléments à la liste:

public void addString(String string) {
  this.stringList.add(string);
}

public void addStrings(Collection<String> strings) {
  this.stringList.addAll(strings);
}

Si vous décidez d'exposer un setter qui remplace la valeur, vous voudrez probablement d'abord vérifier l'exactitude. Puisque votre classe initialise le ArrayList dans un initialiseur d'instance, vous ne vous attendez probablement pas à ce qu'il soit jamais nul. Vous devez donc lever une exception si elle est:

public void setStringList(List<String> stringList) {
  if (stringList == null) {
    throw new NullPointerException("stringList must not be null");
  }
  this.stringList = stringList;
}

Java 7 a ajouté un nouveau Objects.requireNonNull méthode exactement à cet effet.

43
Daniel Pryden

Un setter typique ressemblerait à ceci:

public void setStringList(ArrayList<String> stringList) {
    this.stringList = stringList;
}

Vous pouvez également envisager de renvoyer this dans le but de codage fluide .

public TypeOfYourClass setStringList(ArrayList<String> stringList) {
    this.stringList = stringList;
    return this;
}
4
Marcin Król

Au lieu de la fonction setter, vous pouvez utiliser un constructeur pour affecter un tableau. comme:

public class CLL extends ArrayAdapter<LBean> {
  ArrayList<LBean> lbean;

  public CLL(Context context, ArrayList<LBean> lList) {
      super(context, R.layout.custom_layoutT, lList );
      this.lbean=llist;
  }
  //getter functions
}
2
Gv Ravi