您所在的位置:读书频道 > 设计开发 > Java系列 > 17.2.3 使用Abstract类

17.2.3 使用Abstract类

2007-06-28 11:49 Bruce Eckel 著 陈昊鹏 译 机械工业出版社 字号:T | T
一键收藏,随时查看,分享好友!

《Java编程思想 第4版》共22章,主要包括操作符、控制执行流程、访问权限控制、复用类、多态、接口、通过异常处理错误、字符串、泛型、数组、容器深入研究、Java I/O系统、枚举类型、并发以及图形化用户界面等内容。本文是使用Abstract类。

AD:

17.2.3   使用Abstract类
对于产生用于容器的测试数据问题,另一种解决方式是创建定制的Collection和Map实现。每个java.util容器都有其自己的Abstract类,它们提供了该容器的部分实现,因此你必须做的只是去实现那些产生想要的容器所必需的方法。如果所产生的容器是只读的,就像它通常用的测试数据那样,那么你需要提供的方法数量将减少到最少。
尽管在本例中不是特别需要,但是下面的解决方案还是提供了一个机会来演示另一种设计模式:享元。你可以在普通的解决方案需要过多的对象,或者产生普通对象太占用空间时使用享元。享元模式使得对象的一部分可以被具体化,因此,与对象中的所有事物都包含在对象内部不同,我们可以在更加高效的外部表中查找对象的一部分或整体(或者通过某些其他节省空间的计算来产生对象的一部分或整体)。
这个示例的关键之处在于演示通过继承java.util.Abstract来创建定制的Map和Collection到底有多简单。为了创建只读的Map,可以继承AbstractMap并实现entrySet()。为了创建只读的Set,可以继承AbstractSet并实现iterator()和size()。
本例中使用的数据集是由世界上的国家以及它们的首都构成的Map。capitals()方法产生国家与首都的Map,name()方法产生国名的List。在两种情况中,你都可以通过提供表所需尺寸的int参数来获取部分列表:

为了从AbstractList创建只读的List,你必须实现get()和size()。这里再次使用了享元解决方案:当你寻找值时,get()将产生它,因此这个List实际上并不必组装。
下面是包含经过预初始化,并且都是唯一的Integer和String对的Map,它可以具有任意尺寸:

这里使用的是LinkedHashSet,而不是定制的Set类,因此享元并未完全实现。
练习1:(1) 创建一个List(用ArrayList和LinkedList都尝试一下),然后用Countries来填充。对该列表排序并打印,然后将Collections.shuffle()方法重复地应用于该列表,并且每次都打印它,这样你就可以看到shuffle()方法是如何每次都将列表随机打乱的了。
练习2:(2) 生成一个Map和Set,使其包含所有以字母A开头的国家。
练习3:(1) 使用Countries,用同样的数据多次填充Set,然后验证此Set中没有重复的元素。使用HashSet、LinkedHashSet和TreeSet做此测试。
练习4:(2) 创建一个Collection初始化器,它将打开一个文件,并用TextFile将其断开为单词,然后将这些单词作为所产生的Collection的数据源使用。请演示它是可以工作的。
练习5:(3) 修改CountingMapData.java,通过添加像Countries.java中那样的定制EntrySet类,来完全实现享元。

【责任编辑:雪花 TEL:(010)68476606-8007】

回书目   上一节   下一节

分享到:

  1. Linux服务器配置全程实录
  2. 揭秘--优秀PPT这样制作

热点职位

更多>>

热点专题

更多>>

读书

Wicked Cool Java中文版
本书主要介绍由Sun微系统公司创建的Java编程语言。 除了核心内容外,Java还有许多免费的财富,即开放源代码的库。本书就是为了

51CTO旗下网站

领先的IT技术网站 51CTO 中国首个CIO网站 CIOage 中国首家数字医疗网站 HC3i 51CTO学院 区块链第一聚合媒体 zhijiapro