《数据结构与抽象:Java语言描述(原书第4版)》一2.2.2 包的新实现
本节书摘来华章计算机《数据结构与抽象:Java语言描述(原书第4版)》一书中的第2章 ,第2.1节,[美]弗兰克M.卡拉诺(Frank M. Carrano) 蒂莫西M.亨利(Timothy M. Henry) 着 罗得岛大学 新英格兰理工学院 辛运帏 饶一梅 译 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
2.2.2 包的新实现
方法。可以修改ADT包的前一个实现,通过调整数组大小使包的容量仅由计算机可用的内存量来限定。如果看看程序清单2-1中ArrayBag类的框架,就明白需要修改什么。下面详细说明这些任务:
- 将类名改为ResizableArrayBag,这样就能区分这两个实现。
- 从数组bag的声明中删除标识符final,以便可以调整它的大小。
- 修改构造方法的名字以匹配新的类名。
- 修改方法add的定义,让它总能容纳新项。该方法永远不会返回假,因为包永远不会满。
修改方法add是上述任务中唯一的实质性工作。类的其他部分将保持不变。
方法add。下面是方法add的定义,与2.1.4节中的一样:
因为包永远不会满,所以add应该永远返回真。为达到这个目的,当isArrayFull返回真时我们倍增数组的大小,而不是将result设置为假。在调整数组的大小时,将定义并调用另一个私有方法doubleCapacity,其规格说明如下:
假定我们已经定义了这个私有方法,则可以修改add方法,如下所示:
私有方法doubleCapacity。使用2.2.1节中描述的技术来调整数组bag的大小。因为我们增大包的容量,所以必须检查新的容量不会超出MAX_CAPACITY。在构造方法中也做同样的检查,但不是重复这段代码,而是定义让构造方法和doubleCapacity都能调用的另一个私有方法来强制限制包的容量:
类ResizableArrayBag。新的类可从本书的在线网站上获得。你应该研究这些类的细节。
设计决策:你可能不知道定义类ResizableArrayBag时我们的某些决策,比如会有下列问题:
- 为什么方法add是一个布尔方法而不是一个void方法?它永远返回真!
- 为什么我们定义私有方法doubleCapacity?只有add这一个方法调用它! 类实现了接口BagInterface,所以当定义add时我们遵从它的规格说明。结果有两种不同的实现ArrayBag和ResizableArrayBag,同一位客户可能都会用到。对第二个问题的回答,反映了我们解决问题的方法。为实现add,当数组满时首先要调整数组的大小。不是在方法add内执行这个任务,而是选择说明一个私有方法来扩展数组。不可否认,这个私有方法的定义很短。现在我们可以将私有方法的方法体集成到add中,但我们没有紧迫的理由这样做。另外,通过保留私有方法,我们坚持了一个方法应该执行一个动作的哲学理念。 > 自测题20 可以添加到类ResizableArrayBag中,用给定数组的内容来初始化包的构造方法是什么? 自测题21 在前一个问题描述的构造方法的定义中,需要将参数数组中的项复制到数组bag中吗?或者一条简单的赋值语句(bag = contents)就足够了? 自测题22 使用数组来组织数据的好处是什么?坏处是什么?
测试类。测试类ResizableArrayBag的程序可以创建一个包,它的初始容量很小——例如,3。这个选择可让我们简单测试包增大其容量的能力。例如,当添加第4项时,包的容量要倍增到6。第7次添加时,容量再次倍增,这次是12。可以从本书的在线网站上获得程序ResizableArrayBagDemo。
程序设计技巧:实现了声明ADT操作的单一接口的类,应该将定义在接口中的方法声明为公有方法。但是,类还可以定义私有方法和保护方法。
最后更新:2017-06-26 17:33:12