web-dev-qa-db-ja.com

JavaのArrayListsのゲッターとセッター

JavaでArrayListのゲッターとセッターを使用するにはどうすればよいですか?これが私が持っているものです。私はゲッターを正しく使用していると思いますが、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

値を設定するには、ArrayList<String>をパラメーターとして渡し、パラメーターにArrayListを設定するだけです。

また、質問に示されているArrayList<String>ではなくvoidを使用していることに注意してください。通常、setterメソッドは何も返しません。

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

ただし、ArrayListは変更可能なコンテナクラスなので、実際にはセッターはまったく必要ありません。単に呼び出し元にgetStringList()を呼び出させてから、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");
}

一方、より一般的な要件は、呼び出し元が内部データ構造を変更できないようにすることです。これにより、クラスで実際に不変式を適用できます。そのデータ。 ArrayListは常に変更可能です。したがって、ArrayListを返す必要があるが、プライベート状態を変更したくない場合は、コピーする必要があります。

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

または、可能であれば、戻り値の型を広げてから、クラスがその不変条件を適用するために使用できる他の実装を返すことをお勧めします。たとえば、ゲッターメソッドを使用してArrayListを変更したくない場合は、タイプをArrayList<String>からList<String>に拡張し、変更不可能な実装を使用できます。例:

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

一方、セッターの場合、値の処理方法によって異なります。通常、setFooメソッドはfooの内容を置き換えます。これはもちろんできます:

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

しかし、ほとんどの場合、受け入れるタイプも広げたいと思うでしょう。たとえば、Collectionの代わりにArrayListを受け入れることができます。

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

ただし、他の方法で基になるリストを変更するメソッドを公開する方が便利な場合があります。たとえば、単にリストへの新しいアイテムの追加をサポートしたいだけかもしれません。

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

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

値を置き換えるセッターを公開することにした場合は、おそらく最初にそれが正しいかどうかを確認する必要があります。クラスはインスタンス初期化子でArrayListを初期化するため、ほとんどの場合、nullになるとは思わないでしょう。したがって、次の場合は例外をスローする必要があります。

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

Java 7では、まさにこの目的のために新しい Objects.requireNonNull メソッドが追加されました。

43
Daniel Pryden

典型的なセッターは次のようになります。

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

流fluentなコーディング の目的でthisを返すことも検討できます。

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

セッター関数の代わりに、コンストラクターを使用して配列を割り当てることができます。お気に入り:

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