Java中ArrayList的getter和setter

Java中ArrayList的getter和setter,java,arraylist,getter-setter,Java,Arraylist,Getter Setter,如何在Java中为ArrayList使用getter和setter?这是我的。我认为我正确地使用了getter,但我不知道如何为ArrayList使用setter private ArrayList<String> stringlist = new ArrayList<String>(); public ArrayList<String> getStringList() { return stringlist; } public ArrayList&

如何在Java中为ArrayList使用getter和setter?这是我的。我认为我正确地使用了getter,但我不知道如何为ArrayList使用setter

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
}
private ArrayList stringlist=new ArrayList();
公共ArrayList getStringList(){
返回字符串列表;
}
public ArrayList setStringList(){
//我不知道该在这里放什么
//我也不知道我的返回值是否正确
}

一个典型的setter应该是这样的:

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

要设置该值,可以将
ArrayList
作为参数传递,只需将
ArrayList
设置为参数

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

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

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

public class DataHolder {
private String data;

public DataHolder() {
}

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

public String getData() {
    return this.data;
}
}
相反,我更喜欢C struct风格的编写只保存数据的类:

public class DataHolder {
public final String data;

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

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");
}
或者,如果可能的话,最好扩大返回类型,然后返回一些其他实现,您的类可以使用这些实现来强制执行其不变量。例如,如果不希望人们使用getter方法修改
ArrayList
,可以将类型从
ArrayList
扩展到
List
,并使用不可修改的实现,例如:

public List<String> getStringList() {
  return Collections.unmodifiableList(stringList);
}
但最有可能的是,你还想扩大你将接受的类型。例如,您可以接受任何
集合
,而不仅仅是
数组列表

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

Java 7为此添加了一个新方法。

您可以使用构造函数来分配数组,而不是setter函数。 比如:

公共类CLL扩展了ArrayAdapter{
ArrayList-lbean;
公共CLL(上下文,ArrayList-lList){
super(context,R.layout.custom_layoutT,lList);
this.lbean=llist;
}
//吸气剂函数
}

对于setter,您需要一个参数,例如
setStringList(ArrayList list)
,并且在函数do
stringlist=list
中,该方法的返回类型是ArrayList还是void?或者别的什么?除非特别告诉你,你通常不需要返回二传手。您可以将退货类型更改为作废。回答正确。您可能还想选择一个更具描述性的方法名称,例如
setCompanyNames
,以符合业务逻辑的含义,而不是
setStringList
。我认为这应该是公认的答案,因为它处理封装、可变性/防御性复制和“编程到接口”等重要概念(使用API中的
List
/
Collection
vs
ArrayList
)。创建setter并开始使用getter和setter后,我意识到了这一点。这是一个非常好的答案。我特别喜欢你解释
getter
的“不可修改的实现”和“公开方法以改变基础列表”的方式对于
设置器
public List<String> getStringList() {
  return Collections.unmodifiableList(stringList);
}
public void setStringList(ArrayList<String> stringList) {
  this.stringList = stringList;
}
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);
}
public void setStringList(List<String> stringList) {
  if (stringList == null) {
    throw new NullPointerException("stringList must not be null");
  }
  this.stringList = stringList;
}
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
}