集合列表和子类初始化

时间:2013-01-18 16:35:57

标签: java oop list collections

它总是说使用下面的集合对象更好

1)List st = new LinkedList();

2)Map mp = new HashMap();

3)LinkedList st = new LinkedList();

4)HashMap mp = new HashMap();

我同意通过定义如上(1,2)我可以将同一个变量(st,mp)重新分配给ListMap接口

的其他对象

但在这里,我不能使用仅在LinkedListHashmap中定义的方法,这些方法是正确的,因为ListMap不可见。 (如果我知道的话,请纠正我)

但如果要定义HashMapLinkedList的对象,我想将它用于这些特殊功能。

那为什么说创建集合对象的最佳方法是在(1,2)

中完成的

5 个答案:

答案 0 :(得分:10)

因为大部分时间你不需要需要特殊方法。如果您需要特殊方法,那么显然您需要引用特定类型。

今天的课程:不要盲目地应用编程原则而不使用自己的大脑。

答案 1 :(得分:3)

  

但是如果我定义了HashMap或LinkedList的对象,我想将它用于这些特殊功能。

在这种情况下,您应该使用具体类绝对声明变量。没关系。

使用界面的目的是表明您需要该界面公开的功能,让您可以在以后更改实施。 (尽管您需要注意所选择的具体实施的性能甚至行为影响。)

答案 2 :(得分:1)

  

我同意如上定义(1,2)我可以重新分配同一个变量   (st,mp)到List,Map接口的其他对象

是的,这是一种称为接口编程的通用做法。

  

但是我不能使用仅在LinkedList中定义的方法,   Hashmap是正确的,因为List,Map不可见。   (如果我知道的话,请纠正我)

不,你是对的。

  

但是如果我定义了HashMap或LinkedList的对象,我想使用它   对于这些特殊功能。

     

然后为什么说创建集合对象的最佳方法是   完成于(1,2)

这不是最好的方法。如果需要使用这些类的特定方法,则需要引用具体类型。如果您需要使用不应该知道内部实现的客户端类中的那些集合,那么最好只公开接口。

答案 3 :(得分:1)

通过接口定义服务合同。正如您所说,如果您更改给定界面的较低实现,您可以在不对当前代码产生任何影响的情况下实现它。

如果您需要特定类的任何特定行为,则使用它们是绝对正确的。地图通常扩展自己实现AbstractMap的{​​{1}}类,使子类继承这些方法。

当然,许多类在Map接口的某些已定义方法上抛出IllegalOperationException,因此实现类型更改并不总是完美无缺(但在大多数情况下,它是,因为每个映射都有一个特定资产,使其成为给定上下文的最合适选择。)

使用适合您的类型,而不是有人说它是正确的类型。每条规则都有例外。

答案 4 :(得分:0)

因为如果使用接口访问集合,则可以自由更改实现。例如,使用ArrayList而不是LinkedList,或者使用它的同步版本。

这主要适用于在类的公共接口中有Collection的情况,在内部我不会打扰,只是使用你需要的东西。