我正在创建一个包含List的JavaBean,它可以考虑两种可能性:
public class JavaBeanWithSettableList {
private List<Integer> list;
public List<Integer> getList {
return list;
}
public void setList(final List<Integer> list) {
this.list = list;
}
}
或
public class JavaBeanWithUnsettableList {
private List<Integer> list = new ArrayList<Integer>();
public List<Integer> getList {
return this.list;
}
// No setter - need to use list.add(), list.remove() etc.
}
我在另一个项目中看到的第二个——它看起来更好,但我不确定这个设计是从哪里来的。有人能给我指一篇文章来命名这种模式和/或描述它的好处吗?
此模式没有名称。第一个只是一个带有List
的类,第二个是一个内部创建的列表。
一般来说,类中的状态越少,不变性越强越好。这样做的原因是,如果你的状态较少,那么产生错误的机会就较小。
在您的情况下,例如,如果您使用第一种方法,那么您无法确保其他人不会为您的模型设置另一个列表。在第二种情况下,你不能确保有人不会打电话给你名单上的clear()
。
最终,这一切都取决于您的用例。如果你希望你的类保存一个列表,但你不希望将来有任何更改,你应该使用一个不可变的列表。否则,尽可能地限制可变性。
两者都不是最优的。大概你想要。。。
public class ModelList {
private List<Integer> list;
ModelList() {
this.list = new ArrayList<Integer>();
}
ModelList(final List<Integer> list) {
this.list = list;
}
public ArrayList<Integer> getList {
return new ArrayList<Integer>(list); // Send back a copy, to make Immutable
}
}
第一个的问题是,每次想要更新列表时,都需要创建一个新列表,从模型中获取列表,添加元素并将新列表设置到模型中。
第二个可以让你做到这一点,而不需要获得列表并在之后重置它!