最难忍受的痛苦,也许是想干一件事情而又不去干。——罗曼·罗兰

前言

本篇文章算是拾人牙慧吧,偶尔谷歌到一个能很好把collection framework design讲好的文档,一是为了总结提升,也是collection framework 的开篇,从设计入手,更透彻的理解这个framework的过去和现在。

参照文档是 美国卡内基梅隆大学的Principles of Software Construction这门课程中一节课的课件 - collections design.pdf,建议在看本篇文章前,静下心来通读一遍这个文档。

结合自己的理解对collection framework做一个总结。

设计目标

  • 小且简单。
  • 易扩展。
  • 与之前存在的集合兼容(事实上也做到了,VectorHashtable各自实现了ListMap接口)。
  • 很强的相似性(这个是从易用性角度来考虑的,因为在学习东西的时候,相似的东西是不需要从头学起的,学习成本自然降低了很多,后续源码分析先纵向深入,再横向类比)。

API设计准则

  • 通用性,避免使用固定集合元素(事实上使用泛型来实现)。
  • 与旧API的兼容性(VectorHashtable都分别做了重构)。

文档的重要性

越是基础性的框架,设计文档、API或者是使用性文档越是要通俗易懂,这样基础性框架才便于开发者使用。毕竟大家都不喜欢用黑盒子,至少不会使用自己不熟悉的东西。

特别注意五种文档的完备性:

  • 设计文档
  • 概览文档
  • API文档 - 不仅仅是javadoc
  • 使用教程文档
  • jira list

使用者的意见

多去听取使用者的意见,不好理解不好用的东西,理解不了,用起来自然不爽。

上面说到框架设计应该注意的事项,下面来具体聊一下collection framework design。

框架概览

简言之,我理解有四部分组成:

  1. 层次分明的接口和抽象类。
  2. 接口和抽象类的通用实现或完全实现。
  3. 基础算法。
  4. 并发支持(默认是不支持并发的,后来添加了对集合的封装,但只是简单的包装,效率不高,尤其是随着并发技术的发展,并发粒度越来越小,提供了很多juc的集合实现,逐渐废弃了集合框架中的原来的并发集合)。

值得一提的是,操作数组的工具类跟集合框架同时添加到Java平台,是集合框架的一个依赖工具。

API实现

集合接口分为两组类型接口,分别为 java.util.Collectionjava.util.Map,Map接口的子类严格来说而不是真实的集合。但是,这些接口包含集合视图操作,使它们可以作为集合进行操作。

随着这么多年的积累迭代,collection framework经过十多年的迭代更新(不是截止到现在,而是java 8 ,2014年),最终接口如下。

Collection 的子接口

Collection 的子接口有:

  • java.util.Set
  • java.util.SortedSet
  • java.util.NavigableSet
  • java.util.Queue
  • java.util.concurrent.BlockingQueue
  • java.util.concurrent.TransferQueue
  • java.util.Deque
  • java.util.concurrent.BlockingDeque

Map的子接口

Map的子接口有:

  • java.util.SortedMap
  • java.util.NavigableMap
  • java.util.concurrent.ConcurrentMap
  • java.util.concurrent.ConcurrentNavigableMap

对并发的支持

如上,支持并发的接口都定义在 java.util.concurrent包下,如下:

  • java.util.concurrent.BlockingQueue
  • java.util.concurrent.TransferQueue
  • java.util.concurrent.BlockingDeque
  • java.util.concurrent.ConcurrentMap
  • java.util.concurrent.ConcurrentNavigableMap

集合和算法效率问题

通用集合实现的效率问题,在后续源码分析过程中会使用大O标记法来讨论框架插入删除或查找等算法的复杂度。

总结

  • 一个好的框架设计,不仅要符合API的设计原则,也要考虑易用性,兼容性。
  • 多听取使用者的意见
  • 不管是框架的开发者还是使用者,都应该注重文档的使用

最后,我们不是在聊集合的设计吗,是的,包括集合框架中关键的概念,在collections design.pdf中基本上都涉及到了,不做过多的说明,快去看这个文档吧。

learn from collection framework design的更多相关文章

  1. [书籍]重温《Framework Design Guidelines》

    1. 前言 最近重温了<Framework Design Guidelines>. <Framework Design Guidelines>中文名称为<.NET设计规范 ...

  2. java collection framework

    java collection framework Map

  3. [Framework Design Guideline]

    [Framework Design Guideline]基础知识 最近在读<Framework design guideline>, 感觉其中Framework的许多设计经验同样适用于业务 ...

  4. Java Collection Framework : List

    摘要: List 是 Java Collection Framework的重要成员,详细包括List接口及其全部的实现类.由于List接口继承了Collection接口,所以List拥有Collect ...

  5. Collection FrameWork

    Collection FrameWork如下: Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashta ...

  6. Massive Collection Of Design Patterns, Frameworks, Components, And Language Features For Delphi

    Developer beNative over on GitHub has a project called Concepts which is a massive collection of Del ...

  7. 设计: ListView 接口,and the missing read-only interfaces in java collection framework

    Java的集合框架以其成功易用的设计征服了很多人(包括我),并且教科书式的诠释了泛型的应用方式. 我也是被 Joshua Bloch 的书引领入门,从中得益良多.我当然不会认为自己在设计上比他懂得更多 ...

  8. What is Data Driven Testing? Learn to create Framework

    What is Data Driven Testing? Data-driven is a test automation framework which stores test data in a ...

  9. 集合框架(JCF/Java Collection Framework)

    集合的特点:1.数据的类型可以不同2.集合长度可变3.空间不固定集合也是对象,用于检索,存储以及传输对象集合框架的组成Collection接口和Map接口 Collection是Set接口和List接 ...

随机推荐

  1. JS Math&Date的方法 (上)

    数学对象&时间对象 本篇文章主要介绍Math 和 Date  的常用方法! 一 :Math & Date         Math 数学对象 - 处理数学计算和数学类          ...

  2. Upload-Labs 实验操作记录

    0x01 安装 下载:https://github.com/c0ny1/upload-labs 环境:简单搭建phpstudy环境即可,记得在upload-labs根目录下创建该文件夹 0x02 文件 ...

  3. response没有实现跳转,而是提示浏览器下载文件

    问题简述: web项目中,response没能实现重定向跳转网页,而是通知浏览器下载文件. 代码如下: response.getWriter().write("<h1 style='c ...

  4. s3fs-fuse 把 s3-like 对象存储挂载到本地

    s3fs-fuse 是一个采用 c++

  5. 二进制部署kubernetes集群_kube-apiserver提示"watch chan error: etcdserver: mvcc: required revision has been compacted'

    查看kube-apiserver状态 [root@yxz-cluster01 ~]# systemctl status kube-apiserver -l ● kube-apiserver.servi ...

  6. 挑战全网最幽默的Vuex系列教程:第五讲 Vuex的小帮手

    先说两句 前面已经讲完了 Vuex 下的 State.Getter.Mutation 及 Action 这四驾马车,不知道大家是否已经理解.当然,要想真正熟练掌握的话,还是需要不断的练习和动手实践才行 ...

  7. SVN部署(Centos7,Ubuntu)

    SVN 简介 SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制服务已从CVS迁移到Sub ...

  8. openssl查看证书细节 [转载]

    openssl x509部分命令 打印出证书的内容: openssl x509 -in cert.pem -noout -text 打印出证书的系列号 openssl x509 -in cert.pe ...

  9. java 之 javaBean

    什么是JavaBean? JavaBean是特殊的Java类,使用J ava语言书写,并且遵守JavaBean API规范. JavaBean与其它Java类相比而言独一无二的特征: 提供一个默认的无 ...

  10. js 之 object

    js之object 对象 ECMA-262 把对象(object)定义为“属性的无序集合,每个属性存放一个原始值.对象或函数”.严格来说,这意味着对象是无特定顺序的值的数组. 尽管 ECMAScrip ...