假设我想要松散耦合的接口,我经常避免在方法签名中使用List实现(如ArrayList),而更喜欢使用List接口。但由于Collection是一个更通用的界面,你认为我更喜欢使用Collection over List吗?
编辑:我知道List和Collection之间的区别。我不关心订单或任何特定于列表的功能。这个问题是关于返回值和方法参数。
答案 0 :(得分:4)
从List(扩展Collection)的文档:
有序集合(也称为序列)。该接口的用户可以精确控制列表中每个元素的插入位置。用户可以通过整数索引(列表中的位置)访问元素,并搜索列表中的元素。
简而言之:List保留其元素的顺序(插入顺序或您选择强加的任何其他顺序)。
因此,如果你关心这些事情,请使用List。
答案 1 :(得分:4)
一个好的API应该提供所需的一切,而不会暴露不必要的实现细节。
我发现自己使用List或Set最多。尝试用Collection替换List或Set有时会使API难以使用而不会真正提供任何添加的解耦或抽象。
我尝试在方法签名中避免使用Maps,因为我认为输入/输出过于复杂是一个迹象。这可以通过为此数据创建特定的包装类或通过更改方法的位置来解决,以便它可以直接访问数据(例如,将它放在您传递给方法的类中)。
不要忘记您的面向对象设计是为了让那些维护和调用代码的人更轻松,而不是实现一些完美的圣杯。通常有几种明智的方法可以对问题进行建模,您选择哪种方法取决于您自己的风格以及您正在处理的代码库的预期未来复杂性/用例。
答案 2 :(得分:2)
我只能到List
,Set
或Map
。这给调用者一些关于他们可以期待什么回来的指示,而不是太具体。
我认为将该指示作为方法签名的一部分非常重要。它可以改变他们计划使用结果的方式。
例如。 Collection
不保证Set
之类的唯一条目。返回List
意味着将订购结果等。
答案 3 :(得分:1)
这取决于你打算做什么。
如果订单不重要,Collection
可以理解为List
。
一般来说,正如您所建议的那样,在方法参数中使用高级接口通常是一种好习惯,这样调用代码就需要进行任何转换以满足方法要求。
答案 4 :(得分:0)
这取决于。 Collection
接口与List
具有不同的语义。当您迭代Collection
的元素时,您不希望以特定顺序返回元素。 (实际上对于某些集合类型,迭代顺序实际上是不可预测的。)
此外,您可以使用List
API执行许多操作,但使用Collection
API无法执行这些操作。诸如在特定位置获取,插入或移除元素之类的事情。