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 阅读(331)
评论(0) 编辑 收藏 所属分类:
jdk代码分析