Viv*_*ath 36 java collections abstraction list
我有一个对象,它将一些数据存储在列表中.实现可能会在以后更改,我不希望将内部实现公开给最终用户.但是,用户必须能够修改和访问此数据集.目前我有这样的事情:
public List<SomeDataType> getData() {
return this.data;
}
public void setData(List<SomeDataType> data) {
this.data = data;
}
Run Code Online (Sandbox Code Playgroud)
这是否意味着我已经允许内部实现细节泄漏?我应该这样做吗?
public Collection<SomeDataType> getData() {
return this.data;
}
public void setData(Collection<SomeDataType> data) {
this.data = new ArrayList<SomeDataType>(data);
}
Run Code Online (Sandbox Code Playgroud)
mrm*_*sra 18
返回列表符合最高适当接口的编程.
返回集合会导致用户不明确,因为返回的集合可能是:Set,List或Queue.
通过List.get(int)索引到列表的能力是独立的,用户(或您)是否期望集合的元素处于可靠且可预测的顺序?该集合可以具有相同项目的倍数吗?这些都是对更常见集合不常见的列表的期望.这些是我在确定向最终用户公开哪个抽象时使用的测试.
当返回高层次结构中的接口或类的实现时,经验法则是声明的返回类型应该是最高级别,它提供您准备保证给调用者的最小功能,以及调用者合理的需要.例如,假设您真正返回的是ArrayList.ArrayList实现了List和Collection(以及其他功能).如果您希望调用者需要使用get(int x)函数,那么它将无法返回Collection,您需要返回List或ArrayList.只要你没有看到任何理由为什么你会改变你的实现以使用除列表之外的东西 - 比如说Set - 那么正确的答案就是返回一个List.我不确定ArrayList中是否有任何函数不在List中,但如果有,同样的推理也适用.另一方面,一旦返回List而不是Collection,您现在已经在某种程度上锁定了您的实现.您放入API的次数越少,对未来改进的限制就越少.
(在实践中,我几乎总是在这种情况下返回一个List,它从来没有烧过我.但我可能真的应该返回一个Collection.)
除非有明确的理由使用更具体的类型 - List,否则使用最常用的类型(Collection)是最有意义的.但无论你做什么,如果这是一个供公众消费的API,请在文档中明确说明它的作用; 如果它返回集合的浅表副本,请说明.
归档时间: |
|
查看次数: |
18114 次 |
最近记录: |