它总是说使用下面的集合对象更好
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
接口
但在这里,我不能使用仅在LinkedList
,Hashmap
中定义的方法,这些方法是正确的,因为List
,Map
不可见。 (如果我知道的话,请纠正我)
但如果要定义HashMap
或LinkedList
的对象,我想将它用于这些特殊功能。
那为什么说创建集合对象的最佳方法是在(1,2)
中完成的答案 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的情况,在内部我不会打扰,只是使用你需要的东西。