learn from collection framework design

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

前言

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

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

结合本身的理解对collection framework作一个总结。api

设计目标

  • 小且简单。
  • 易扩展。
  • 与以前存在的集合兼容(事实上也作到了,VectorHashtable分别实现了ListMap接口)。
  • 很强的类似性(这个是从易用性角度来考虑的,由于在学习东西的时候,类似的东西是不须要从头学起的,学习成本天然下降了不少,后续源码分析先纵向深刻,再横向类比)。

API设计准则

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

文档的重要性

越是基础性的框架,设计文档、API或者是使用性文档越是要通俗易懂,这样基础性框架才便于开发者使用。毕竟你们都不喜欢用黑盒子,至少不会使用本身不了解的东西。数组

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

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

使用者的意见

多去听取使用者的意见,很差理解很差用的东西,理解不了,用起来天然不爽。框架

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

框架概览

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

  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中基本上都涉及到了,不作过多的说明,快去看这个文档吧。

相关文章
相关标签/搜索