java - 原因 - List list = new ArrayList();

标签 java list arraylist

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

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/

相关文章:

java - PhantomJSDriver.getCurrentUrl() 返回约 :blank

正则表达式:计算单词列表中的匹配项

python - 删除列表中其他字符串的子字符串而不更改列表的原始顺序?

c++ - 对类型 'Item *const' 的引用无法绑定(bind)到类型 'const Item *' 的右值

java - 在 Java 中将 MySQL 数据库项存储在 ArrayList 中

java - 使用下一个值重新启动循环

java - 自定义 json 序列化调整

java - Spring boot CORS 过滤器不适用于 AngularJS

java - LinkedList 与 ArrayList 在一个特定的 android 示例上

java - 遍历具有包含任意数量子树作为子树的数组列表的树