免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1290 | 回复: 0
打印 上一主题 下一主题

松耦合不能抛弃必要的约定 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-16 00:24 |只看该作者 |倒序浏览
看到帖子有问:
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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP