1

它总是说最好使用如下的集合对象

1)List st = new LinkedList();

2)Map mp = new HashMap();

3)LinkedList st = new LinkedList();

4)HashMap mp = new HashMap();

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

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

但是,如果要定义HashMapor的对象LinkedList,我想将其用于这些中的一些特殊功能。

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

4

5 回答 5

10

因为大多数时候你不需要特殊的方法。如果您需要特殊方法,那么显然您需要引用特定类型。

今天的教训:不要盲目地应用编程原理而不用自己的大脑。

于 2013-01-18T16:38:31.490 回答
3

但是,如果要定义 HashMap 或 LinkedList 的对象,我想将其用于其中的一些特殊功能。

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

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

于 2013-01-18T16:38:38.447 回答
1

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

是的,这是一种称为针对接口编程的一般做法。

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

不,你是对的。

但是,如果要定义 HashMap 或 LinkedList 的对象,我想将其用于其中的一些特殊功能。

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

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

于 2013-01-18T16:39:33.517 回答
1

通过接口定义服务契约。正如您所说,如果您更改给定接口的较低实现,您可以完美地做到这一点,而不会影响您当前的代码。

如果您需要特定类的任何特定行为,使用它们是绝对正确的。Maps 通常扩展AbstractMap自身实现的类Map,使子类继承这些方法。

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

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

于 2013-01-18T16:42:45.110 回答
0

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

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

于 2013-01-18T16:39:04.133 回答