0

有效的 java 鼓励使用接口而不是抽象/具体类。问题是是否存在接口层次结构,应该选择哪种接口类型以及为什么?

例如,一个ArrayList实现List哪个实现Collection哪个实现Iterable。那么我们什么时候通过 a listvs collectionvs iterable

显而易见的答案是每个子类都在不断添加更多功能。那么我们是否应该继续向上爬,直到匹配所需的功能?我的意思是,如果只需要在一个虚构的应用程序iterator()中,那么使用Iterableelse 使用List

4

2 回答 2

3

始终使用满足您需求的最抽象的接口。

在 Iterable、Collection、List 的示例中,如果您只需要迭代,则只需传递一个 Iterable。如果您只需要 Collection 提供的方法,那么只需传递一个集合。

这样做的原因是您以后可以轻松更换。

例如,如果您有一个只需要 Iterable 但将 List 作为函数参数的函数,那么稍后如果您认为将数据存储为 HashSet 更有意义,则必须更改大量代码才能实现工作。但是,由于 HashSet 是 Iterable,如果您最初只是将 Iterable 传递给您的函数,您将不得不更改更少的代码。

在某些情况下,它还使测试更容易。例如,假设您有一些扩展接口 Bar 的接口 Foo。如果您有一个接受 Foo 参数的函数,那么您必须模拟 Bar 期望的所有内容,并且必须模拟 Foo 添加到其中的所有内容。如果您的函数只需要一个 Bar 参数,那么您只需要模拟 Bar。

于 2013-10-20T00:24:14.943 回答
0

从他的评论中可以清楚地看出,OP 一直想要“最抽象”,通常我会同意。

但是,在我的实践经验中,size()确实非常有用。(笑话省略)。随着代码的发展,通常会变得更加有用。所以,为了提前计划,在这个具体的例子中,我的建议是使用 Collection over Iterable。

于 2013-10-20T00:34:52.763 回答