Java中ArrayLists的getter和Setter

6 java arraylist getter-setter

我如何在Java中使用getList和setter作为ArrayList?这就是我所拥有的.我认为我正在使用getter,但我不知道如何使用setList作为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
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*den 43

ArrayList但是,它是一个可变容器类,所以你根本不需要一个setter:只需让调用者调用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");
}
Run Code Online (Sandbox Code Playgroud)

另一方面,更常见的要求是防止调用者能够改变内部数据结构,以便您的类实际上可以对其数据实施其不变量.ArrayList总是可变的,所以如果你需要返回一个,ArrayList但你不想修改你的私有状态,你需要复制:

public ArrayList<String> getStringList() {
  return new ArrayList<String>(stringList);
}
Run Code Online (Sandbox Code Playgroud)

或者,如果可能的话,最好扩大返回类型,然后返回一些其他实现,您的类可以使用它来强制执行其不变量.例如,如果您不希望人们ArrayList使用getter方法修改您的类型,则可以将类型ArrayList<String>扩展为List<String>并使用不可修改的实现,例如:

public List<String> getStringList() {
  return Collections.unmodifiableList(stringList);
}
Run Code Online (Sandbox Code Playgroud)

另一方面,对于setter,它取决于您希望如何处理值.通常,setFoo方法会替换 foo的内容,您当然可以这样做:

public void setStringList(ArrayList<String> stringList) {
  this.stringList = stringList;
}
Run Code Online (Sandbox Code Playgroud)

但很可能你也希望扩大你会接受的类型.例如,您可以接受任何Collection而不仅仅是ArrayList:

public void setStringList(Collection<String> strings) {
  this.stringList = new ArrayList<>(strings);
}
Run Code Online (Sandbox Code Playgroud)

但是,替代地公开方法以其他方式改变基础列表可能更有用.例如,您可能只想支持向列表中添加新项:

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

public void addStrings(Collection<String> strings) {
  this.stringList.addAll(strings);
}
Run Code Online (Sandbox Code Playgroud)

如果你决定要揭露一个setter,它取代了价值,你可能想先检查它的正确性.由于您的类ArrayList在实例初始化程序中初始化,因此您很可能不会期望它将为null.所以你应该抛出异常,如果它是:

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

Java 7 Objects.requireNonNull为此提供了一种新方法.

  • 我认为这应该是公认的答案,因为它处理封装,可变性/防御性复制和"编程到接口"的重要概念(在API中使用`List` /`Collection` vs`ArrayList`). (6认同)

小智 5

要设置该值,您可以将ArrayList<String>传递的参数作为参数,并且只需将 设置ArrayList为该参数即可。

另外,请注意您的问题中使用的void而不是ArrayList<String>显示的。通常,setter 方法不返回任何内容。

public void setStringList(ArrayList<String> stringList)
{
    this.stringList = stringList;
}
Run Code Online (Sandbox Code Playgroud)