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 类的设计,是一种解耦。
理解Map与子类实现

本文探讨了在Java中,为何LinkedHashMap即使继承了HashMap,仍需显式实现Map接口。通过自建类和接口,分析了实现Map接口对类设计的重要性,确保了业务逻辑的兼容性和解耦。
973





