原因 - 列表列表 = 新的 ArrayList();
我见过很多次这样的代码:
List<String> list = new ArrayList<String>();
为什么人们采用(和其他类)的父级而不是生成的对象的类型?ArrayList
这需要更少的性能吗?或者为什么有人应该这样做?
我见过很多次这样的代码:
List<String> list = new ArrayList<String>();
为什么人们采用(和其他类)的父级而不是生成的对象的类型?ArrayList
这需要更少的性能吗?或者为什么有人应该这样做?
当有人写这样的代码时,他/她试图遵循一个基本的OO设计原则,即 -
程序到接口,而不是具体实现
我已经在我的一篇博客文章中解释了这个原则。请看该部分。Class Inheritance VS Interface Inheritance
总而言之,当您使用父类型的引用来引用子类型的实例时,您将获得很大的灵活性。例如,如果将来需要更改子类型实现,则可以轻松完成此操作,而无需更改大部分代码。
请考虑以下方法 -
public void DoSomeStuff(Super s) {
s.someMethod();
}
和对此方法的调用 -
DoSomeStuff(new Sub());
现在,如果你需要更改里面的逻辑,你可以通过声明一个新的子类型,比如说,并改变该实现中的逻辑来轻松做到这一点。这样,您就不必接触使用该方法的其他现有代码。您仍然可以通过以下方式使用您的方法 -someMethod
Super
NewSubType
DoSomeStuff
DoSomeStuff(new NewSubType());
如果您将 参数声明为 be ,那么您也必须更改其实现 -DoSomeStuff
Sub
DoSomeStuff(NewSubType s) {
s.someMethod();
}
它也可能连锁/气泡到其他几个地方。
就集合示例而言,这使您可以毫不费力地更改变量指向的列表实现。您可以轻松地使用 a 代替 .LinkedList
ArrayList
当你写:
List<String> list = new ArrayList<String>();
然后,您确定将仅使用接口 List 的功能
。
(实现,所以更灵活)。使用此选项,允许您将来将 更改为其他类型(如 ..)。ArrayList
List
List
ArrayList
LinkedList