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

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

List names = new ArrayList(); 

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

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

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

例如 –

你有List names = new ArrayList(); 稍后你决定你应该使用List接口的其他一些实现,比如LinkedList所以你只需将它改为List names = new LinkedList(); 什么都没有打破

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

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

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

 List names = new ArrayList(); 

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

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

 List names = new //some other implementation of List 

现在如果你做了如下的事情 –

 ArrayList names = new ArrayList(); 

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

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

编程到接口,而不是实现

这是Gang of Four(GoF)的设计模式 。 这是为什么?

您可以通过抽象合同而不是具体实现来指导。

 public class MyClass { private List myList ; public setMyList(List list){ myList=list; } } 

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

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

阅读本文对界面编程意味着什么?