这样的代码我见过很多次了:
List<String> list = new ArrayList<String>();
人们为什么要取ArrayList
的父级(和其他类)而不是生成对象的类型?
这会降低性能吗?或者为什么有人要这样做?
最佳答案
当有人编写这样的代码时,他/她正在尝试遵循基本的 OO 设计原则,即 -
Program to an interface, not to a concrete implementation
我已经在 one of my blog posts 中解释了这个原理。 .查看 Class Inheritance VS Interface Inheritance
部分。
总结这篇文章,当您使用父类型的引用来引用子类型的实例时,您会获得很大的灵 active 。例如,如果您将来需要更改子类型的实现,您将能够轻松地做到这一点,而无需更改大部分代码。
考虑以下方法 -
public void DoSomeStuff(Super s) {
s.someMethod();
}
以及对该方法的调用 -
DoSomeStuff(new Sub());
现在,如果您需要更改 someMethod
中的逻辑,您可以轻松地通过声明 Super
的新子类型来实现,例如 NewSubType
,并更改该实现内部的逻辑。这样,您将永远不必接触使用该方法的其他现有代码。您仍然可以通过以下方式使用您的 DoSomeStuff
方法 -
DoSomeStuff(new NewSubType());
如果您将 DoSomeStuff
的参数声明为 Sub
,那么您也必须更改其实现 -
DoSomeStuff(NewSubType s) {
s.someMethod();
}
它也可能链接/冒泡到其他几个地方。
就您的集合示例而言,这使您可以轻松更改变量指向的列表实现。您可以轻松地使用 LinkedList
代替 ArrayList
。
关于java - 原因 - List list = new ArrayList();,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18329311/