哪个界面更喜欢和基于什么?

时间:2013-10-20 00:10:52

标签: java collections interface effective-java

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

例如,ArrayList实现List实现Collection实现Iterable。 那么我们何时通过list vs collection vs iterable

明显的答案是每个子类不断添加更多功能。那么我们应该继续爬上层级,直到所需的功能匹配为止? 我的意思是如果在虚构的应用程序中只需要iterator(),那么使用Iterable否则使用List

2 个答案:

答案 0 :(得分:3)

始终使用满足您需求的最抽象的界面。

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

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

例如,如果你有一个只需要Iterable的函数但是将List作为函数参数,那么稍后如果你认为将数据存储为HashSet更有意义,你必须改变很多代码使它工作。但是,由于HashSet是Iterable,如果您刚刚将Iterable传递给函数,那么您将不得不更改更少的代码。

在某些情况下,它也使测试更容易。例如,想象一下,你有一些扩展接口Bar的接口Foo。如果你有一个带有Foo参数的函数,那么你必须模拟Bar期望的所有东西,你必须模拟Foo添加到它上面的所有内容。如果你的函数只需要一个Bar参数,那么你只需要模拟Bar。

答案 1 :(得分:0)

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

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