有效的java鼓励使用接口而不是抽象/具体类。 问题是,是否存在接口heirachy,应选择哪种接口类型以及为什么?
例如,ArrayList
实现List
实现Collection
实现Iterable
。
那么我们何时通过list
vs collection
vs iterable
?
明显的答案是每个子类不断添加更多功能。那么我们应该继续爬上层级,直到所需的功能匹配为止?
我的意思是如果在虚构的应用程序中只需要iterator()
,那么使用Iterable
否则使用List
?
答案 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。