Java中ArrayLists的getter和Setter

时间:2015-10-11 01:09:02

标签: 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
}

5 个答案:

答案 0 :(得分:38)

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");
}

另一方面,更常见的要求是阻止调用者能够改变内部数据结构,以便您的类实际上可以对其数据实施其不变量。 ArrayList始终是可变的,因此如果您需要返回ArrayList,但又不想修改私有州,则需要复制:

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

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

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

另一方面,对于setter,它取决于你想如何处理这些值。通常情况下,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);
}

如果您决定公开替换该值的setter,您可能需要首先检查它是否正确。由于您的类在实例初始化程序中初始化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方法。

答案 1 :(得分:3)

典型的setter看起来像这样:

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

您还可以考虑以fluent coding为目的返回this

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

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:2)

取而代之的是setter函数,可以使用构造函数来分配数组。 像:

public static void main(String[] args) {
    Map<String, List<String>> invertedindex = new HashMap<String, List<String>>();
    List<String> myList = new ArrayList<>();
    myList.add("firstitem");
    myList.add("seconditem");
    invertedindex.put("book", myList);
    invertedindex.put("book2", myList);
    int count_ = Collections.frequency(invertedindex.values(), myList);
    System.out.println(count_);
}

答案 4 :(得分:-2)

我们作为程序员所做的最简单的事情之一就是传递数据。传统的方法是定义JavaBean:

public class DataHolder {
private String data;

public DataHolder() {
}

public void setData(String data) {
    this.data = data;
}

public String getData() {
    return this.data;
}
}

相反,我更喜欢编写仅包含数据的类的C结构样式:

public class DataHolder {
public final String data;

public DataHolder(String data) {
    this.data = data;
}
}