【Java_基础深入】LinkedHashMap 继承 HashMap又实现 Map 接口背后的设计思想

38 篇文章 0 订阅
23 篇文章 2 订阅

JDK源码的类定义

public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>

可以发现LinkedHashMap extends HashMap已经被动实现了Map,
为什么还需要主动 implements Map
以下将自己建立接口,模仿业务逻辑,从设计的角度分析这个问题

自己重现JDK设计

理清楚类的关系,去考虑自己设计这种类应该注意什么方面

建立 LinkedHashMap 的依赖关系

public interface Map {
    public void get();
}
public class HashMap implements Map {
    @Override
    public void get() {
        System.out.println("HashMap实现Map接口的方法");
    }
}

LinkedHashMap 不主动实现 Map

public class LinkedHashMap extends HashMap {
    @Override
    public void get() {
        System.out.println("linkedHashMap的get方法");
    }
}

使用自建的 LinkedHashMap

public class MyApplication {

	/**
     * @param map 多态的实现,可以传入LinkedHashMap 或者HashMap
     */
    private static void doMapAction(Map map){
        map.get();
    }
    
    public static void main(String[] args) {
        LinkedHashMap linkedHashMap = new LinkedHashMap();
        doMapAction(linkedHashMap);
    }
}

遇到重构任务

  • 任务:HashMap 要进行升级,HashMap implements Map 修改成 HashMap implements SuperMap

重构出现问题

  • 问题:修改HashMap实现,doMapAction会报错
        LinkedHashMap linkedHashMap = new LinkedHashMap();
        doMapAction(linkedHashMap); // 报错,方法声明为Map, linkedHashMap不再是Map的多态实现

解决问题

解决以上的问题,其实很简单,只需要把LinkedHashMap的类定义主动实现Map
public class LinkedHashMap extends HashMap implements Map

结论

从两种设计的类图来看:
public class LinkedHashMap extends HashMap
在这里插入图片描述
public class LinkedHashMap extends HashMap implements Map
在这里插入图片描述
doMapAction(Map map)的业务逻辑兼容HashMap的改动
在这里插入图片描述
implements Map 的设计思想就是把Map 作为 LinkHashMap直接依赖
从工具类的语义上,方法doMapAction(Map map) 不用关心HashMap 类的设计,是一种解耦。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值