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