cod*_*leb 27 java list arraylist
我见过很多次这样的代码:
List<String> list = new ArrayList<String>();
为什么人们采用ArrayList(和其他类)的父代替生成对象的类型?
这会降低性能吗?或者为什么有人这样做?
MD *_*med 38
当有人写这样的代码时,他/她正试图遵循基本的OO设计原则,该原则说 -
编程到接口,而不是具体实现
我在我的一篇博文中解释了这个原则.看看这一Class Inheritance VS Interface Inheritance节.
总结一下这篇文章,当您使用父类型的引用来引用子类型的实例时,您将获得很大的灵活性.例如,如果您将来需要更改子类型实现,则可以轻松地执行此操作,而无需更改大量代码.
考虑以下方法 -
public void DoSomeStuff(Super s) {
s.someMethod();
}
Run Code Online (Sandbox Code Playgroud)
并调用此方法 -
DoSomeStuff(new Sub());
Run Code Online (Sandbox Code Playgroud)
现在,如果您需要更改内部逻辑someMethod,您可以通过声明一个新的子类型Super,比如说NewSubType,并更改该实现中的逻辑来轻松实现.通过这种方式,您将永远不必触及使用该方法的其他现有代码.您仍然可以DoSomeStuff通过以下方式使用您的方法 -
DoSomeStuff(new NewSubType());
Run Code Online (Sandbox Code Playgroud)
假如你声明的参数DoSomeStuff是的Sub,你将不得不改变其实施过-
DoSomeStuff(NewSubType s) {
s.someMethod();
}
Run Code Online (Sandbox Code Playgroud)
它也可能链接/冒泡到其他几个地方.
就收集示例而言,这使您可以更改变量指向的列表实现,而不会有太多麻烦.您可以轻松使用LinkedList代替ArrayList.
Mar*_*oun 12
当你写:
List<String> list = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)
然后,您确定只使用界面 的功能List.
(ArrayList实现List,因此List更灵活).使用此功能,您可以ArrayList在将来将其更改为其他类型(例如LinkedList..).
chr*_*her 11
这意味着您可以list在任何位置交换实现List接口的任何类型,而不是创建只能使用的刚性模型ArrayList.例如:
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>();
}
Run Code Online (Sandbox Code Playgroud)
这将是abstract您使用该list对象的代码,远离细节,如确切的对象类型list.它需要知道的是它有add方法等.这称为松耦合.
| 归档时间: |
|
| 查看次数: |
32389 次 |
| 最近记录: |