为什么有些人使用List基类来实例化一个新的ArrayList?

时间:2013-07-03 23:10:59

标签: java

我不断遇到人们实例化新ArrayList并将其分配给List接口的代码,如下所示:

List<String> names = new ArrayList<String>();

这种方法背后的原因是什么?

4 个答案:

答案 0 :(得分:18)

将代码与接口的特定实现分离。

这也有助于您将来转移到List接口的另一个实现。

例如 -

您以后List<String> names = new ArrayList<String>();确定应该使用List界面的其他实现,比如LinkedList,所以您只需将其更改为List<String> names = new LinkedList<String>();即可什么都没有。

答案 1 :(得分:4)

此类代码不使用 List类,变量声明为List类型。这称为abstraction

List是一个接口,用于定义实际类具有的方法,而不指定使用哪个实际类。

虽然这里没什么大不了的,但这种做法非常重要,即使在更复杂的情况下也是必不可少的。始终遵循这种模式是一种好习惯。

答案 2 :(得分:3)

  

编程到接口,而不是实现

来自Gang of Four(GoF)的design pattern。 这是为什么?

您可以通过抽象合同而非具体实施来指导。

public class MyClass {

    private List myList ;

    public setMyList(List list){
        myList=list;
    }

}

而不是ArrayList实现您想要LinkedList实现?  这样你只需要用setter注入该属性。

抽象是关键,你对实现只有规范的指导一无所知。

阅读此What does it mean programming to an interface?

答案 3 :(得分:3)

List<String> names = new ArrayList<String>();

通过这种方式,您可以针对接口List编写代码,如果必须,可以在将来轻松切换实现。

在这种情况下,以下就足够了 -

List<String> names = new //some other implementation of List

现在,如果您按照以下方式执行操作 -

ArrayList<String> names = new ArrayList<String>();

您将针对实施ArrayList本身进行编码。并且您的代码与特定实现相关联。如果您必须切换实现,则需要进行大量代码更改。

检查docs以发现Java 6提供的一些标准实现。