ArrayList<E>的设计思路分析

周末花时间翻了翻JDK源码,想从中学习一下面向对象的设计思路。

主要从平常使用的最多的Collection中阅读一些。花时间做了一些总结,如有错误,欢迎指正。

image.png ArrayList 的设计路径:

  1. 定义了Collection【集合】的概念,定义了集合所能达成的事情
  2. 一方面对集合的公共部分具象化,形成AbstractCollection;
  3. 另一方面,将Collection细分为List、Set等接口,分别自行继承Collection,添加自己的’集合’特征(如Set是不可重复的,List可重复等)
  4. 针对List以及使用Collection的公共能力,抽象出抽象类AbstractList,在该类中,进一步将List的公共部分具象化。
  5. 完全具象化AbstractList,按照接口规约,以不同的形式实现出:ArrayList、LinkList;此时一个设计链路完成,在具象化的ArrayiList中,还进行实现了Cloneable()等。


能否直接 Collection collectionString = new ArrayList<>();

  1. 答案是肯定的,因为他是从Collection派生出来的
  2. 为什么没人这么用呢?我的理解是这样无法定制化的使用到List的能力了,仅能使用最基本的集合的能力,没有必要这么干。


有意思的是,ArrayList继承了AbstractList,明明AbstractList已经实现了List,但是ArrayList依旧自行实现了List,这明显是多此一举的。在stack overflow上找到了一个说法: 

image.png
说是原作者表示,这是一个mistake,之前觉得是有意义的。

简易总结方法论:

  1. 找到概念最上层的抽象,定义出基本的功能。(例:文件存储,抽象出:FileStore interface;upLoad()、downLoad()方法)
  2. 对定义出的基本功能,往下细致的划分,若基本功能能做统一处理,使用模板方法,抽象出一个Abstract类,在该类中做公共的处理。(该步骤若无,可不进行,不过我一般会在interface和class中间有一个Abstract,方便后续的扩展)
  3. 对最上层抽象做具象化,分解出各种不同的实现方式。(例:分解成云端存储形式cloudFilestore interface、LocalFileStore interface;然后云端的一半都会有密钥、加解密等等,在这个interface里面定义)
  4. 针对不同的方式做最终实现。(例:cloudFileStore interface 具象化为:AliCloudFileStore class、TencentCloudFIleStore;两个Class具体自行完成文件存储的能力)
  5. 实际使用:
    FileStore fileStore = new AliCloudFileStore() or CloudFileStore store = new AliCloudFileStore();
    fileStore.upLoad();


有什么好处:

  1. 易扩展,若项目中出现新的需求,需要添加新的存储方式,如百度云存储,仅需要找到CloudFileStore接口,做具体实现即可,之前针对接口编写的能力均能正常使用。
  2. 使用端无需关心具体使用了什么FileStore进行存储【里氏替换原则】。使用端可要求传入一个FileStore接口即可,至于你传入的是AliCloudFileStore还是TencentCloudFIleStore,并不关心,使用端使用FileStore.upload()便完成了。

Guess you like

Origin juejin.im/post/7039537202660900895