原因 - 列表列表 = 新的 ArrayList();

2022-09-01 11:19:33

我见过很多次这样的代码:

List<String> list = new ArrayList<String>();

为什么人们采用(和其他类)的父级而不是生成的对象的类型?ArrayList

这需要更少的性能吗?或者为什么有人应该这样做?


答案 1

当有人写这样的代码时,他/她试图遵循一个基本的OO设计原则,即 -

程序到接口,而不是具体实现

我已经在我的一篇博客文章中解释了这个原则。请看该部分。Class Inheritance VS Interface Inheritance

总而言之,当您使用父类型的引用来引用子类型的实例时,您将获得很大的灵活性。例如,如果将来需要更改子类型实现,则可以轻松完成此操作,而无需更改大部分代码。

请考虑以下方法 -

public void DoSomeStuff(Super s) {
    s.someMethod();
}

和对此方法的调用 -

DoSomeStuff(new Sub());

现在,如果你需要更改里面的逻辑,你可以通过声明一个新的子类型,比如说,并改变该实现中的逻辑来轻松做到这一点。这样,您就不必接触使用该方法的其他现有代码。您仍然可以通过以下方式使用您的方法 -someMethodSuperNewSubTypeDoSomeStuff

DoSomeStuff(new NewSubType());

如果您将 参数声明为 be ,那么您也必须更改其实现 -DoSomeStuffSub

DoSomeStuff(NewSubType s) {
    s.someMethod();
}

它也可能连锁/气泡到其他几个地方。

就集合示例而言,这使您可以毫不费力地更改变量指向的列表实现。您可以轻松地使用 a 代替 .LinkedListArrayList


答案 2

当你写:

List<String> list = new ArrayList<String>();

然后,您确定将仅使用接口 List 的功能
(实现,所以更灵活)。使用此选项,允许您将来将 更改为其他类型(如 ..)。ArrayListListListArrayListLinkedList