我不断遇到人们实例化一个新的 ArrayList 并将其分配给 List 接口的代码,如下所示:
List<String> names = new ArrayList<String>();
这种方法背后的原因是什么?
我不断遇到人们实例化一个新的 ArrayList 并将其分配给 List 接口的代码,如下所示:
List<String> names = new ArrayList<String>();
这种方法背后的原因是什么?
将您的代码与接口的特定实现分离。
List
这也有助于您在将来迁移到该接口的另一个实现。
例如 -
稍后您List<String> names = new ArrayList<String>();
决定应该使用List
接口的其他实现,比如说LinkedList
您只需将其更改为List<String> names = new LinkedList<String>();
并且没有任何中断。
编程到接口,而不是实现
这是来自四人组 (GoF)的设计模式。这是为什么?
您通过抽象契约而不是具体实现来指导。
public class MyClass {
private List myList ;
public setMyList(List list){
myList=list;
}
}
ArrayList
你想要实现而不是LinkedList
实现呢?这样,您只需使用 setter 注入该属性。
抽象是关键,您对实现一无所知,仅按规范指导。
阅读本文对接口进行编程意味着什么?
这样的代码不使用List
类,它将变量声明为 type List
。这称为抽象
List
是一个接口,它定义了实际类有哪些方法,而不指定使用哪个实际类。
虽然在这里没什么大不了的,但这种做法可能非常重要,甚至在更复杂的情况下也是必不可少的。始终遵循这种模式是一种很好的做法。
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 提供的一些标准实现。