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

JDK源码的类定义

public class HashMap extends AbstractMap implements Map, Cloneable, Serializable

public class LinkedHashMap extends HashMap implements Map

【源码|【java_基础深入】LinkedHashMap 继承 HashMap又实现 Map 接口背后的设计思想】可以发现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
源码|【java_基础深入】LinkedHashMap 继承 HashMap又实现 Map 接口背后的设计思想
文章图片

public class LinkedHashMap extends HashMap implements Map
源码|【java_基础深入】LinkedHashMap 继承 HashMap又实现 Map 接口背后的设计思想
文章图片

doMapAction(Map map)的业务逻辑兼容HashMap的改动
源码|【java_基础深入】LinkedHashMap 继承 HashMap又实现 Map 接口背后的设计思想
文章图片

implements Map 的设计思想就是把Map 作为 LinkHashMap直接依赖
从工具类的语义上,方法doMapAction(Map map) 不用关心HashMap 类的设计,是一种解耦。

    推荐阅读