jdk集合的基本層次有三層。
Collection-->List-->ArrayList,比如這樣的結構。
同時伴隨著一條抽象類的線。
AbstractCollection-->AbstractList-->ArrayList,比如這樣的線。
這是因為jdk集合,把list,set都看成是collection。本來,對于list,或者對于set.下面的結構圖很好的解決了類層次
的設計問題。
圖(1)
但是list和set又要提取抽象出去。所以又得把這個結構改裝。改裝圖如下:
這圖稍微復雜了一點(而且,他只是類繼承體系的一邊而已,比如是List那一邊)。接口繼承接口,抽象類實現接口繼承抽象類。仔細看下,其實也很明白。說明:
MyInterface-->MyAbstractClass-->MyConcreteClassB.這是圖(1)的一邊,當MyConcreteClassB類需要擴展新方法,而不僅僅局限于MyInterface接口定義的方法呢?首先想到的當然是,讓MyConcreteClassB同時實現另一個具有新方法的接口。考慮到新接口在集合類中也是一種MyInterface接口,所以,這個新接口繼承了MyInterface。同時,對于新接口也需要缺省的或公共的方法,所以,把MyConcreteClassB改裝為抽象類,最后,讓最終的具體去繼承該抽象類以及實現新接口。變成了上面的圖。當然,這只是一個基本圖。如果,你不一樣的需求,完全可以改裝你想要的結構。但是,這樣的結構,相信維護起來很好。
然而還是有點疑問?比如說LinkList,當我這樣編碼時,addFirst方法被過濾了。也就是LinkList無法抽象。因為這個是List接口之外LinkedList自己擴展的方法。
List linkList = new LinkedList();
linkList.addFirst("abc"); //error
linkList.add("bcd");
LinkedList linkList = new LinkedList();
linkList.addFirst("abc"); //OK
linkList.add("bcd");
又比如,在Stack設計上,Stack是繼承于Vector的方式來實現,這樣就擁有了Vector的所有方法,而這些方法在Stack是不該有的。讓人有摸不著頭腦的感覺。感覺用委托會好點吧。thinking java 里提到了關于這一點。是建議用LinkedList 委托來實現的。建議大家不要用java.uti.Stack類。而自己通過LinkedList 去構造一個Stack.
posted on 2008-08-14 15:36
zhqh 閱讀(334)
評論(0) 編輯 收藏 所屬分類:
jdk代碼分析