原因 – List list = new ArrayList();
我已经多次看过这样的代码了:
List list = new ArrayList();
为什么人们采用ArrayList
(和其他类)的父代替生成对象的类型?
这会降低性能吗? 或者为什么有人这样做?
当有人写这样的代码时,他/她正试图遵循一个基本的OO设计原则,该原则说 –
编程到接口,而不是具体实现
我在我的一篇博文中解释了这个原则。 查看“ Class Inheritance VS Interface Inheritance
部分。
总结一下这篇文章,当您使用父类型的引用来引用子类型的实例时,您会获得很大的灵活性。 例如,如果您将来需要更改子类型实现,则可以轻松地执行此操作,而无需更改大量代码。
考虑以下方法 –
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
。
这意味着您可以在任何位置使用实现List
接口的任何内容交换list
类型,而不是创建只能使用ArrayList
的刚性模型。 例如:
private List list; public SomeConstructor() { // At this point, you can make it any type of object you want. list = new ArrayList (); list = new LinkedList (); list = new AttributeList (); }
这将abstract
使用list
对象的代码,而不是像确切的对象类型list
那样的细节。 它需要知道的是它有add
方法等。这叫做Loose Coupling 。
当你写:
List
然后,您确定只使用接口 List
的function。
( ArrayList
实现List
,因此List
更灵活)。 使用它,允许您将来将ArrayList
更改为其他类型(如LinkedList
..)。
解决问题:
为了更灵活,您可以启动界面List
:
因此,如果您不需要所有ArrayList
只使用List
。
你可以这样写: List
。
当然,较少的function可以帮助提高性能。 如您所知,如果您想使用multithreading应用程序,请使用Vector
但这会降低您的性能。
从这里开始
因为方法不必知道您使用的列表实现。
方法只需要知道它是一个列表。
仍然可以使用该方法。
始终编程到接口,而不是具体实现。 (在这种情况下列表)
通常,最好使用Interface类(在本例中为List
),以便在需求发生变化时,以后可以使用任何List实现代替最小的烦恼。
虽然ArrayList
可能支持一些不在List
接口上的方法,但是这个声明清楚地表明那些额外的方法在这种情况下是不相关的。
List list = new ArrayList ();
在集合框架中, List
是一个接口,而ArrayList
是实现的。 您这样做的主要原因是将代码与接口的特定implementation
分离,如果您希望将来转移到List
其他实现,这将有所帮助。