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中基本上都涉及到了,不作過多的說明,快去看這個文檔吧。

相關文章
相關標籤/搜索