【发布时间】:2011-02-24 10:45:06
【问题描述】:
我有一个将一些数据存储在列表中的对象。实现以后可能会改变,我不想将内部实现暴露给最终用户。但是,用户必须具有修改和访问此数据集合的能力。目前我有这样的事情:
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);
}
【问题讨论】:
-
要记住的一件事是,如果您像这样返回实际的集合或列表,您就允许其他人做他们想做的任何事情,包括删除项目甚至清除整个事情。您最好返回一个不可变的包装器或列表的副本。
-
@PaulTomblin 是的,但它对系统来说有点矫枉过正和人为的开销。在处理由持久性中间件管理的对象时,不可修改的包装器是有意义的,即使在极少数情况下也是如此。
-
@comeGetSome,这就是为什么我说“可能”而不是“必须”。这取决于用例——如果我正在制作一个 API 供其他人使用,我会返回一个副本或一个包装器。如果是为了我自己或值得信赖的同事,我会在 javadocs 中写一个很大的“不要修改这个值”并保留它。
标签: java list collections abstraction