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
文章图片
public class LinkedHashMap extends HashMap implements Map
文章图片
doMapAction(Map map)
的业务逻辑兼容HashMap的
改动文章图片
implements Map
的设计思想就是把Map
作为 LinkHashMap
的直接依赖,从工具类的语义上,方法
doMapAction(Map map)
不用关心HashMap
类的设计,是一种解耦。推荐阅读
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)