6

我的问题几乎是构成标题的oneliner。什么时候适合使用List interface代替Collection interface

这只是一个关于清晰度和可读性的问题,即如果我使用任何一个ListCollection取决于我的代码,代码的意图会更清晰,还是有一些我不知道的其他优点?

4

6 回答 6

5

任何一种方式都可以争论,当然,假设您不依赖于 List 的方法/功能,并且您将调用的任何其他方法都不是期望 List。

有一种说法是,最好使用适合该工作的最通用类型,以允许可能导致切换到非列表类的代码修改/重用。

还有一种观点认为,最好使用包含所有计划用途的最具体的类型,以便在计划用途的范围内拥有最大的权力和灵活性。使用更具体的类型也是一种自我文档,因为它表明了代码功能的范围。

根据我的经验,代码重用的好处往往被夸大了,而且很少在为多用途开发的代码库之外取得成果。所以我倾向于使用更具体的类型。

于 2013-10-10T16:10:46.343 回答
3

当您需要以下好处时:

除了继承自 Collection 的操作之外,List 接口还包括以下操作:

列为

位置访问——根据元素在列表中的数字位置来操作元素

Search — 在列表中搜索指定对象并返回其数字位置

迭代——扩展迭代器语义以利用列表的顺序特性

Range-view — 对列表执行任意范围操作。

于 2013-10-10T15:58:17.097 回答
1

这个问题很好地权衡了利弊。本质上,List将一些额外的功能应用于 a Collection,因为List实际上是 a Collection

如果我是你,我会考虑你的代码的要求。如果您只需要在集合对象中添加和删除项目,那么您应该使用Collection.

如果您希望保留顺序,在特定索引处获取列表中的项目或删除给定位置的元素,那么您应该使用List,因为Collection不提供此功能。

于 2013-10-10T15:59:15.707 回答
1

这取决于,您是否希望您的用户能够对数据进行索引?如果是,请使用列表。两者都是接口,因此您不会泄露实现细节,实际上,您只需要确定所需的最低功能。

于 2013-10-10T16:38:57.387 回答
0

这取决于。

如果您不关心正在使用什么类型的集合,那么Collection<E>将是合适的。如果您需要指定应使用 、 等类型,请指定List<E>Set<E>

您也可以添加Iterable<E>到您的问题中;这完全取决于所需的特异性水平。

于 2013-10-10T16:01:04.430 回答
0

如果您引用的对象实现了 List 接口(例如 ArrayList、LinkedList) - 当然最好使用 List 引用。根据我糟糕的经验 - 我不记得上次在生产代码中看到 Collection 引用是什么时候。从来不需要这样的抽象。如果合适,使用 List 会更清晰。

于 2013-10-11T21:18:09.320 回答