我有一个对象,它将一些数据存储在列表中。实现可能会稍后改变,我不想将内部实现公开给最终用户。但是,用户必须有能力修改和访问这个数据集合。目前我有这样的事情:使用列表或集合更好吗?
public List<SomeDataType> getData() {
return this.data;
}
public void setData(List<SomeDataType> data) {
this.data = data;
}
这是否意味着我已允许内部实现细节泄漏?我应该这样做吗?
public Collection<SomeDataType> getData() {
return this.data;
}
public void setData(Collection<SomeDataType> data) {
this.data = new ArrayList<SomeDataType>(data);
}
有一点需要记住的是,如果你像这样返回实际的集合或列表,你允许别人做他们想做的任何事情,包括删除项目甚至清除整个事情。您最好返回一个不可变的包装或列表副本。 – 2010-05-26 23:55:57
@PaulTomblin是真实的,但它对系统有点矫枉过正和人为的开销。不可修改的包装器在处理由持久性中间件管理的对象时是有意义的,甚至在极少数情况下也是如此。 – comeGetSome 2013-05-10 22:06:03
@comeGetSome,这就是为什么我说“可能”而不是“必须”。这取决于用例 - 如果我为他人使用API,我会返回一个副本或包装。如果是为了我自己或是为了值得信任的同事,我会在javadoc中放入一个大的“不要修改这个价值”,然后放在那里。 – 2013-05-11 15:21:44