关于Java:list list = NealAlayList.()的原因;

Reason for - List list = new ArrayList();

本问题已经有最佳答案,请猛点这里访问。

我见过很多这样的代码:

List list = new ArrayList();

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

这会降低性能吗?或者为什么要有人这样做?


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

Program to an interface, not to a concrete implementation

我在我的一篇博文中解释了这个原则。查看Class Inheritance VS Interface Inheritance部分。

为了总结文章,当您使用父类型的引用引用子类型的实例时,可以获得很大的灵活性。例如,如果将来需要更改子类型实现,则可以轻松地进行更改,而无需更改大部分代码。

考虑以下方法-

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

以及对该方法的调用-

1
DoSomeStuff(new Sub());

现在,如果您需要更改someMethod中的逻辑,您可以通过声明Super的新子类型(比如NewSubType)并更改该实现中的逻辑来轻松完成。通过这种方式,您将永远不必接触使用该方法的其他现有代码。您仍然可以用以下方法使用您的DoSomeStuff方法-

1
DoSomeStuff(new NewSubType());

如果您声明DoSomeStuff的参数为Sub的参数,那么您也必须更改它的实现。-

1
2
3
DoSomeStuff(NewSubType s) {
    s.someMethod();
}

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

就您的收集示例而言,这允许您更改变量指向的列表实现,而无需太多麻烦。您可以很容易地使用LinkedList代替ArrayList


这意味着您可以在任何时候用实现List接口的任何东西交换List类型,而不是创建只能使用ArrayList的刚性模型。例如:

1
2
3
4
5
6
7
8
9
private List<String> list;

public SomeConstructor()
{
     // At this point, you can make it any type of object you want.
     list = new ArrayList<String>();
     list = new LinkedList<String>();
     list = new AttributeList<String>();
}

这将使abstract您使用List对象的代码远离具体的对象类型List等细节。它只需要知道它有add方法等,这叫做松耦合。


当你写:

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

然后确定只使用接口List的功能。(ArrayList实现List,所以List更灵活)。使用它,可以在将来将ArrayList更改为其他类型(如LinkedList)。


要解决问题:

为了获得更大的灵活性,您可以启动接口List

所以如果你不需要所有的ArrayList,只使用List

你可以这样写:List = Arrays.asList("aa","bb","cc")

当然,更少的功能可以帮助提高性能。如您所知,如果您想使用多线程应用程序,请使用Vector,但它会降低您的性能。

enter image description here

从这里带走


因为方法不需要知道您使用的列表实现。

一个方法只需要知道这是一个列表。

方法仍然可以使用。

总是编程到一个接口,而不是具体的实现。(在本例中为列表)


通常情况下,最好使用接口类(在本例中为List),这样,如果需求发生变化,任何列表实现稍后都可以用最小的麻烦替换。

虽然ArrayList可能支持不在List接口上的某些方法,但此声明清楚地表明,在这种情况下,这些额外的方法是不相关的。


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

在集合框架中,List是接口,而ArrayList是实现接口。您这样做的主要原因是将代码与接口的特定implementation分离,如果您希望在将来转移到List的其他实现,这将很有帮助。