Collection list = new LinkedList(); // Good?
LinkedList list = new LinkedList(); // Bad?
第一种变体提供了更大的灵活性,但这就是全部吗?还有其他理由喜欢它吗?性能怎么样?
答案 0 :(得分:7)
这些是设计决策,一种尺寸通常不适合所有。内部使用的成员变量的选择也可以(并且通常应该)与暴露给外部世界的内容不同。
从本质上讲,Java的集合框架不提供描述性能特性的完整接口集,而不会暴露实现细节。描述性能的一个界面RandomAccess
是标记界面,甚至不会扩展Collection
或重新公开get(index)
API。所以我认为没有一个好的答案。
根据经验,我认为类型尽可能不具体,直到我认识到(并记录)一些重要的特征。例如,只要我希望方法知道保留了插入顺序,我就会从Collection
更改为List
,并记录该限制的重要性。同样,如果说从前面有效删除变得很重要,请从List
移至LinkedList
。
当涉及在公共API中公开集合时,我总是试图开始暴露几个预期会被使用的API;例如add(...)
和iterator()
。
答案 1 :(得分:2)
Collection list = new LinkedList(); //bad
这很糟糕,因为你不希望这个引用引用一个HashSet(因为HashSet也实现了Collection,因此集合框架中的许多其他类也是如此)。
LinkedList list = new LinkedList(); //bad?
这很糟糕,因为好的做法是始终对接口进行编码。
List list = new LinkedList();//good
这很好,因为点了2天。(Always Program To an Interface)
答案 2 :(得分:2)
在非公共对象上使用最具体的类型信息。它们是实现细节,我们希望我们的实现细节尽可能具体和精确。
答案 3 :(得分:1)
不确定。例如,如果java将为List集合找到并实现更有效的实现,但是您已经拥有仅接受LinkedList的API,那么如果您已经拥有此API的客户端,则无法替换该实现。如果使用接口,则可以在不破坏API的情况下轻松替换实现。
答案 4 :(得分:0)
他们完全相同。使用one over another的唯一原因是,如果您以后想要使用仅存在于LinkedList类中的list函数,则需要使用第二个函数。
答案 5 :(得分:0)
我的一般规则是,只有你当时需要的那样具体(或者需要在不久的将来,在合理的范围内)。当然,这有点主观。
在您的示例中,我通常会将其声明为List
,因为Collection
上的可用方法不是很强大,而List
与另一个{{1}之间的区别(Collection
,Map
等)通常具有逻辑意义。
此外,在Java 1.5+中不要使用原始类型 - 如果您不知道列表将包含的类型,请至少使用Set
。