- 论坛徽章:
- 0
|
看到帖子有问:
abstract public class MibData implements Cloneable
{
private LinkedHashMap mibInfo = new LinkedHashMap();
public LinkedHashMap getMibInfoMap()
{
String[][] arr = getMibInfoArr();
for (int i = 0; i
abstract public class MibData implements Cloneable
{
private Map mibInfo = new LinkedHashMap();
public Map getMibInfoMap()
{
String[][] arr = getMibInfoArr();
for (int i = 0; i arr.length; i++ )
{
mibInfo.put(arr[1], arr[0]);
}
return mibInfo;
}
abstract protected String[][] getMibInfoArr();
}
即LinkedHashMap 改成Map
又有反问他的改动:
你就以为什么都得用接口?
答曰:
面向对象的精髓是松耦合 ,就为这个。
------------------------------------------
但我觉得不是,
松耦合不能抛弃必要的约定;
本来,getMibInfoMap() 返回的东西是实现了Serializable, Cloneable, Map
三个接口的LinkedHashMap
再者,LinkedHashMap 继承自HashMap,那它就有clone, containsKey, entrySet, isEmpty, keySet....等方法
也就是说,本来的约定是返回一个有HashMap,Serializable,Cloneable等方法的LinkedHashMap
改成Map之后,单纯的Map接口是没有HashMap ,Serializable,的方法的,如果改成Map,无端端约定的功能就少了(Serializable, Cloneable,中的“功能”,和HashMap中的功能
从代码角度来说
如果方法是:LinkedHashMap getMibInfoMap()
可以正常的 getMibInfoMap().entrySet();
如果是:Map getMibInfoMap()
getMibInfoMap().entrySet();就危险了,
这样使用是“不可靠”的,因为getMibInfoMap()不能保证返回的一定是LinkedHashMap....
当然,在他的实现是把mibInfo 赋了LinkedHashMap
但是要注意,方法是要被调用的,方法返回的是Map
调用者怎么知道你返回的Map还是否实现了其他的HashMap, Serializable功能?
调用者拿到返回的对象之后,只能再对这个对象调用Map接口中有的方法;
使用Map接口以外的方法,都是不对的;
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/103494/showart_2053277.html |
|