我的问题几乎就是组成标题的oneliner。什么时候使用List interface
而不是Collection interface
?
这只是一个关于清晰度和可读性的问题,即如果我根据我的代码使用List
或Collection
,或者我还有其他一些优势,那么代码的意图会更清晰我不知道?
答案 0 :(得分:4)
当然,假设您不依赖于List的方法/功能,并且您将调用的其他方法都不希望List。
有一种观点认为最好使用最适合这项工作的通用类型,以允许代码修改/重用,这可能导致切换到非List类。
还有一种观点认为,最好使用包含所有计划用途的最具体类型,以便在计划用途的范围内拥有最大的权力和灵活性。使用更具体的类型也是一种自我文档,因为它表明代码功能的狭隘性。
根据我的经验,代码重用的好处往往被夸大,并且很少在为多次使用而开发的代码库之外产生结果。所以我倾向于使用更具体的类型。
答案 1 :(得分:3)
当您需要以下好处时:
除了从Collection继承的操作外,List interface还包括以下操作:
列为
位置访问 - 根据列表中的数字位置操作元素
搜索 - 搜索列表中的指定对象并返回其数字位置
迭代 - 扩展Iterator语义以利用列表的顺序性
Range-view - 对列表执行任意范围操作。
答案 2 :(得分:1)
This question在衡量利弊方面做得很好。从本质上讲,List
会将一些额外的功能应用于Collection
,因为List
实际上是Collection
。
如果我是你,我会考虑你的代码的要求。如果只需要在集合对象中添加和删除项目,则应使用Collection
。
如果您希望保留排序,请抓住列表中特定索引处的项目或删除指定位置的元素,然后您应该使用List
,因为Collection
不提供此功能。
答案 3 :(得分:1)
这取决于,您是否希望您的用户能够索引数据?如果是,请使用List。两者都是接口,因此您不会泄漏实现细节,实际上,您只需要确定所需的最低功能。
答案 4 :(得分:0)
取决于。
如果您不关心使用何种类型的集合,那么Collection<E>
将是合适的。如果您需要指定应使用List<E>
,Set<E>
等类型,请指定该类型。
您还可以在问题中添加Iterable<E>
;这一切都取决于需要什么样的特异性。
答案 5 :(得分:0)
如果您引用的对象实现List接口(例如ArrayList,LinkedList) - 当然最好使用List引用。从我糟糕的经历 - 我不记得我上次在生产代码中看到集合引用。从来不需要这样的抽象。如果合适,使用List会更清楚。