我不断遇到人们实例化新ArrayList并将其分配给List接口的代码,如下所示:
List<String> names = new ArrayList<String>();
这种方法背后的原因是什么?
答案 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注入该属性。
抽象是关键,你对实现只有规范的指导一无所知。
答案 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提供的一些标准实现。