Java 中 ArrayLists 的 getter 和 setter
Getters and Setters for ArrayLists in Java
我将如何为 Java 中的 ArrayList 使用 getters 和 setters?这是我所拥有的。我想我正确地使用了 getter,但我不知道如何将 setter 用于 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
}
典型的 setter 看起来像这样:
public void setStringList(ArrayList<String> stringList) {
this.stringList = stringList;
}
您也可以考虑返回 this
以达到 fluent coding 的目的。
public TypeOfYourClass setStringList(ArrayList<String> stringList) {
this.stringList = stringList;
return this;
}
要设置该值,您可以将 ArrayList<String>
作为参数传递,然后只需将 ArrayList
设置为参数即可。
此外,请注意问题中显示的 void
而不是 ArrayList<String>
的使用。通常,setter 方法不会 return 任何东西。
public void setStringList(ArrayList<String> 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 结构体 类 写作风格:
public class DataHolder {
public final String data;
public DataHolder(String data) {
this.data = data;
}
}
但是,ArrayList
是一个可变容器 class,因此您实际上根本不需要 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");
}
另一方面,更常见的要求是 防止 调用者能够改变内部数据结构,以便您的 class 可以实际执行其不变量在其数据上。 ArrayList
总是可变的,所以如果你需要 return 一个 ArrayList
但你不希望你的私人状态被修改,你需要复制:
public ArrayList<String> getStringList() {
return new ArrayList<String>(stringList);
}
或者,如果可能,最好扩展 return 类型,然后 return 一些其他实现,您的 class 可以使用它来强制执行其不变量。例如,如果您不希望人们使用 getter 方法修改您的 ArrayList
,您可以将类型从 ArrayList<String>
扩展到 List<String>
并使用不可修改的实现,例如:
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,您可能需要先检查它的正确性。由于您的 class 在实例初始化程序中初始化了 ArrayList
,因此您很可能不希望它永远为空。所以你应该抛出一个异常,如果它是:
public void setStringList(List<String> stringList) {
if (stringList == null) {
throw new NullPointerException("stringList must not be null");
}
this.stringList = stringList;
}
Java 7 添加了一个新的 Objects.requireNonNull
方法正是为了这个目的。
代替setter函数,您可以使用构造函数来分配数组。
喜欢:
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
}
我将如何为 Java 中的 ArrayList 使用 getters 和 setters?这是我所拥有的。我想我正确地使用了 getter,但我不知道如何将 setter 用于 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
}
典型的 setter 看起来像这样:
public void setStringList(ArrayList<String> stringList) {
this.stringList = stringList;
}
您也可以考虑返回 this
以达到 fluent coding 的目的。
public TypeOfYourClass setStringList(ArrayList<String> stringList) {
this.stringList = stringList;
return this;
}
要设置该值,您可以将 ArrayList<String>
作为参数传递,然后只需将 ArrayList
设置为参数即可。
此外,请注意问题中显示的 void
而不是 ArrayList<String>
的使用。通常,setter 方法不会 return 任何东西。
public void setStringList(ArrayList<String> 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 结构体 类 写作风格:
public class DataHolder {
public final String data;
public DataHolder(String data) {
this.data = data;
}
}
ArrayList
是一个可变容器 class,因此您实际上根本不需要 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");
}
另一方面,更常见的要求是 防止 调用者能够改变内部数据结构,以便您的 class 可以实际执行其不变量在其数据上。 ArrayList
总是可变的,所以如果你需要 return 一个 ArrayList
但你不希望你的私人状态被修改,你需要复制:
public ArrayList<String> getStringList() {
return new ArrayList<String>(stringList);
}
或者,如果可能,最好扩展 return 类型,然后 return 一些其他实现,您的 class 可以使用它来强制执行其不变量。例如,如果您不希望人们使用 getter 方法修改您的 ArrayList
,您可以将类型从 ArrayList<String>
扩展到 List<String>
并使用不可修改的实现,例如:
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,您可能需要先检查它的正确性。由于您的 class 在实例初始化程序中初始化了 ArrayList
,因此您很可能不希望它永远为空。所以你应该抛出一个异常,如果它是:
public void setStringList(List<String> stringList) {
if (stringList == null) {
throw new NullPointerException("stringList must not be null");
}
this.stringList = stringList;
}
Java 7 添加了一个新的 Objects.requireNonNull
方法正是为了这个目的。
代替setter函数,您可以使用构造函数来分配数组。 喜欢:
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
}