为什么有些人使用List基类来实例化一个新的ArrayList?
我不断遇到代码,人们实例化一个新的ArrayList并将其分配给List接口,如下所示:
List names = new ArrayList();
这种方法背后的原因是什么?
将代码与接口的特定实现分离。
这也有助于您将来转移到List
接口的另一个实现。
例如 –
你有List
稍后你决定你应该使用List
接口的其他一些实现,比如LinkedList
所以你只需将它改为List
什么都没有打破
这样的代码不使用 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注入该属性。
抽象是关键,你对实现只有规范的指导一无所知。
阅读本文对界面编程意味着什么?