12

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

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

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

4

4 回答 4

18

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

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

例如 -

稍后您List<String> names = new ArrayList<String>();决定应该使用List接口的其他实现,比如说LinkedList您只需将其更改为List<String> names = new LinkedList<String>();并且没有任何中断。

于 2013-07-03T23:12:33.657 回答
4

编程到接口,而不是实现

这是来自四人组 (GoF)的设计模式。这是为什么?

您通过抽象契约而不是具体实现来指导。

public class MyClass {

    private List myList ;

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

}

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

抽象是关键,您对实现一无所知,仅按规范指导。

阅读本文对接口进行编程意味着什么?

于 2013-07-03T23:11:36.700 回答
4

这样的代码不使用List类,它将变量声明为 type List。这称为抽象

List是一个接口,它定义了实际类有哪些方法,而不指定使用哪个实际类。

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

于 2013-07-03T23:16:03.157 回答
3
List<String> names = new ArrayList<String>();

这样,您就可以针对 interface 编写代码List,这使得将来如果必须切换实现变得容易。

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

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

现在,如果您执行以下操作 -

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

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

查看文档以发现 Java 6 提供的一些标准实现。

于 2013-07-03T23:13:22.243 回答