learn from collection framework design
最难忍受的痛苦,也许是想干一件事情而又不去干。——罗曼·罗兰
前言
本篇文章算是拾人牙慧吧,偶尔谷歌到一个能很好把collection framework design讲好的文档,一是为了总结提升,也是collection framework 的开篇,从设计入手,更透彻的理解这个framework的过去和现在。
参照文档是 美国卡内基梅隆大学的Principles of Software Construction这门课程中一节课的课件 - collections design.pdf,建议在看本篇文章前,静下心来通读一遍这个文档。
结合自己的理解对collection framework做一个总结。
设计目标
- 小且简单。
- 易扩展。
- 与之前存在的集合兼容(事实上也做到了,
Vector和Hashtable各自实现了List和Map接口)。 - 很强的相似性(这个是从易用性角度来考虑的,因为在学习东西的时候,相似的东西是不需要从头学起的,学习成本自然降低了很多,后续源码分析先纵向深入,再横向类比)。
API设计准则
- 通用性,避免使用固定集合元素(事实上使用泛型来实现)。
- 与旧API的兼容性(
Vector和Hashtable都分别做了重构)。
文档的重要性
越是基础性的框架,设计文档、API或者是使用性文档越是要通俗易懂,这样基础性框架才便于开发者使用。毕竟大家都不喜欢用黑盒子,至少不会使用自己不熟悉的东西。
特别注意五种文档的完备性:
- 设计文档
- 概览文档
- API文档 - 不仅仅是javadoc
- 使用教程文档
- jira list
使用者的意见
多去听取使用者的意见,不好理解不好用的东西,理解不了,用起来自然不爽。
上面说到框架设计应该注意的事项,下面来具体聊一下collection framework design。
框架概览
简言之,我理解有四部分组成:
- 层次分明的接口和抽象类。
- 接口和抽象类的通用实现或完全实现。
- 基础算法。
- 并发支持(默认是不支持并发的,后来添加了对集合的封装,但只是简单的包装,效率不高,尤其是随着并发技术的发展,并发粒度越来越小,提供了很多juc的集合实现,逐渐废弃了集合框架中的原来的并发集合)。
值得一提的是,操作数组的工具类跟集合框架同时添加到Java平台,是集合框架的一个依赖工具。
API实现
集合接口分为两组类型接口,分别为 java.util.Collection和 java.util.Map,Map接口的子类严格来说而不是真实的集合。但是,这些接口包含集合视图操作,使它们可以作为集合进行操作。
随着这么多年的积累迭代,collection framework经过十多年的迭代更新(不是截止到现在,而是java 8 ,2014年),最终接口如下。
Collection 的子接口
Collection 的子接口有:
java.util.Setjava.util.SortedSetjava.util.NavigableSetjava.util.Queuejava.util.concurrent.BlockingQueuejava.util.concurrent.TransferQueuejava.util.Dequejava.util.concurrent.BlockingDeque
Map的子接口
Map的子接口有:
java.util.SortedMapjava.util.NavigableMapjava.util.concurrent.ConcurrentMapjava.util.concurrent.ConcurrentNavigableMap
对并发的支持
如上,支持并发的接口都定义在 java.util.concurrent包下,如下:
java.util.concurrent.BlockingQueuejava.util.concurrent.TransferQueuejava.util.concurrent.BlockingDequejava.util.concurrent.ConcurrentMapjava.util.concurrent.ConcurrentNavigableMap
集合和算法效率问题
通用集合实现的效率问题,在后续源码分析过程中会使用大O标记法来讨论框架插入删除或查找等算法的复杂度。
总结
- 一个好的框架设计,不仅要符合API的设计原则,也要考虑易用性,兼容性。
- 多听取使用者的意见
- 不管是框架的开发者还是使用者,都应该注重文档的使用
最后,我们不是在聊集合的设计吗,是的,包括集合框架中关键的概念,在collections design.pdf中基本上都涉及到了,不做过多的说明,快去看这个文档吧。
learn from collection framework design的更多相关文章
- [书籍]重温《Framework Design Guidelines》
1. 前言 最近重温了<Framework Design Guidelines>. <Framework Design Guidelines>中文名称为<.NET设计规范 ...
- java collection framework
java collection framework Map
- [Framework Design Guideline]
[Framework Design Guideline]基础知识 最近在读<Framework design guideline>, 感觉其中Framework的许多设计经验同样适用于业务 ...
- Java Collection Framework : List
摘要: List 是 Java Collection Framework的重要成员,详细包括List接口及其全部的实现类.由于List接口继承了Collection接口,所以List拥有Collect ...
- Collection FrameWork
Collection FrameWork如下: Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashta ...
- 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 ...
- 设计: ListView 接口,and the missing read-only interfaces in java collection framework
Java的集合框架以其成功易用的设计征服了很多人(包括我),并且教科书式的诠释了泛型的应用方式. 我也是被 Joshua Bloch 的书引领入门,从中得益良多.我当然不会认为自己在设计上比他懂得更多 ...
- 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 ...
- 集合框架(JCF/Java Collection Framework)
集合的特点:1.数据的类型可以不同2.集合长度可变3.空间不固定集合也是对象,用于检索,存储以及传输对象集合框架的组成Collection接口和Map接口 Collection是Set接口和List接 ...
随机推荐
- 最后の冲刺 for Alpha release 12/15/2015
好开心啊,又吃成长快乐了~ 据说release前一天,团队的工作效率会达到顶峰.亲证无效!!! release当天才是团队智力效力能力的巅峰好不好?!因为,今天,plan B:福昕pdf reader ...
- 玩转控件:Fucking ERP之流程图
前言 首先,跟守护在作者公众号和私信作者催更的朋友们道个歉.疫情的原因,公司从年初到现在一直处于996+的高压模式,导致公众号更新频率较低.而且作者每更新一篇原创公众号,既要对自己沉淀知识负责,也要对 ...
- [YII2] 3步发送邮件,有图有真相!
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABOQAAAIcCAYAAABW0HFSAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjw ...
- 开源软件SoftEther使用
最近在寻找比较好用的开源VPN,感觉SoftEther很符合我的需求.一方面是SoftEther属于开源软件并且一直在更新,另一方面是功能强大,好用. VPN支持路由功能和NAT功能,还支持多种类型的 ...
- iview使用之怎样通过render函数在tabs组件中添加标签
在实际项目开发中我们通常会遇到一些比较'新颖'的需求,而这时iview库里往往没有现成可用的组件示例,所以我们就需要自己动手翻阅IviewAPI进行自定义一些组件,也可以说是将iview库里的多种组件 ...
- 21.SpringCloud实战项目-后台题目类型功能(网关、跨域、路由问题一文搞定)
SpringCloud实战项目全套学习教程连载中 PassJava 学习教程 简介 PassJava-Learning项目是PassJava(佳必过)项目的学习教程.对架构.业务.技术要点进行讲解. ...
- 2层感知机(神经网络)实现非线性回归(非线性拟合)【pytorch】
import torch import numpy import random from torch.autograd import Variable import torch.nn.function ...
- 即时通信WebSocket 和Socket.IO
WebSocket HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯. 在2008年诞生,2011年成为国际标准. 现在基本所有浏览器都已经支持了. We ...
- 域名和服务器绑定及https协议更换
服务器是之前已经购买了的 1.腾讯云产品中搜索域名注册(产品太多了懒得找,直接搜索来得快些) 2.进去之后可以选择各种后缀的域名,输入自己喜欢的,看看哪些后缀是没有被注册的.自己挑选一个就可以,按照指 ...
- Java 基础之详解 Java IO
Java IO基本概念 Java IO:即Java输入/输出系统,区分Java的输入和输出:把自己当成程序, 当你从外边读数据到自己这里就用输入(InputStream/Reader), 向外边写数据 ...