認識 Collection 架構


針對收集物件的需求,Java SE提供了Collection API,而Lambda新特性的加入,對Collection API在運用時增添不少幫助,JDK8也對Collection API作了不少增強,瞭解Collection API,是瞭解Lambda應用時不錯的起點。

Collection API介面繼承架構設計如下:

Collection API介面繼承架構


收集物件的行為,像是新增物件的add()方法,移除物件的remove()方法等,都是定義在java.util.Collection中。既然可以收集物件,也要能逐一取得物件,這就是java.lang.Iterable定義的行為,它定義了iterator()方法傳回java.util.Iterator實作物件,可以讓你逐一取得收集之物件,Iterable也是JDK8對Collection API進行增強的對象之一,詳細操作方式,稍後再作說明。

收集物件的共同行為定義在Collection中,然而收集物件會有不同的需求。如果希望收集時記錄每個物件的索引順序,並可依索引取回物件,這樣的行為定義在java.util.List介面中。如果希望收集的物件不重複,具有集合的行為,則由java.util.Set定義。如果希望收集物件時可以佇列方式,收集的物件加入至尾端,取得物件時可以從前端,則可以使用java.util.Queue。如果希望可以對Queue的兩端進行加入、移除等操作,則可以使用java.util.Deque

收集物件時,會依需求使用不同的介面實作物件,舉例來說,如果想要收集時具有索引順序,實作方式之一就是使用陣列,而以陣列實作List的就是java.util.ArrayList,如果你查看API文件,會發現有以下繼承與實作架構:

ArrayList繼承與介面實作架構


Java SE API不僅提供許多已實作類別,也考慮到你自行擴充API的需求,以收集物件的基本行為來說,其提供java.util.AbstractCollection實作了Collection基本行為,java.util.AbstractList實作了List基本行為,必要時,你可以繼承AbstractCollection實作自己的Collection,繼承AbstractList實作自己的List,這會比直接實作CollectionList介面方便許多。

有時為了只表示我們感興趣的介面或類別,會簡化繼承與實作架構圖。例如:

簡化後的Collection繼承與介面實作架構


這樣的表示方式,可以更清楚地明瞭哪些類別實作了哪個介面、繼承了哪個類別,或哪些介面又繼承自哪個介面,至於詳細的繼承與實作架構,可在API文件上查詢。