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
类的设计,是一种解耦。