技术开发 频道

用J2SE 5.0创建定制的泛型集合



三、 测试Queue类

  下列类用于测试"泛型"队列。
package com.heatonresearch.examples.collections;  public class TestQueue {   public static void main(String args[]) {    Queue<Integer> queue = new Queue<Integer>();    queue.push(1);    queue.push(2);    queue.push(3);    try {     System.out.println("Pop 1:" + queue.pop());     System.out.println("Pop 2:" + queue.pop());     System.out.println("Pop 3:" + queue.pop());    }    catch (QueueException e) { e.printStackTrace(); }   }  }
前面的代码中创建的队列仅接收整型对象。

Queue<Integer> queue = new Queue<Integer>();

  接下来的测试把三个整数添加到该队列上。

queue.push(1);
queue.push(2);
queue.push(3);

  注意,添加到该队列中的这些数字都是原始的类型。因为J2SE的自动装箱特性,这些原始的int类型被自动地转变成Integer对象。

  接下来,该测试使用pop方法检索对象。在该队列为空的情况下,该测试捕获到QueueException异常。从队列中弹出三个数字的结果是:

1
2
3

  尽管在这里作为一接收的整数队列显示,但是因为泛型,所以队列类对于任何Java对象情况都能正常工作。

  四、 创建一个可预知的Stack集合


  这里是一个更复杂的集合类型-它实现了一个堆栈以使你在实际删除一个对象之前能够预知或"可偷看"。你可以或者通过使用一个迭代算子或使用J2SE 5.0的新的"for each"结构语句来进行预知。

  这个PeekableStack类是一个先进后出(FILO)栈-让你遍历当前栈中的内容。它的实现使用了两个类。首先,PeekableStack类实现实际的栈部分。其次,PeekableStackIterator类实现一个"Java标准的"Iterator类-你可以用它来遍历整个栈。列表2(见所附源代码文件)显示出PeekableStack类的具体编码。

  注意,列表2中的PeekableStack类实现了Iterable接口。这对于支持新型的J2SE 5.0"for-each"结构语句是必要的。该Iterable接口用于指定你的集合支持"iterator"方法-它返回一个迭代算子。如果没有这个接口,你的类将无法与新型的"for-each"结构语句相兼容。

  这个可预知的栈包含push和pop方法,就象队列一样。该push方法仅仅是比队列稍微复杂些。而push方法负责把对象添加到栈上去并增加版本数(version)。

  这个version变量允许PeekableStackIterator类保证没有修改操作发生。在迭代算子创建时,这个算子保留一份当前版本数。如果栈上通过调用push方法发生任何变化,那么这个版本数就不会匹配;此不匹配将导致算子抛出一个ConcurrentModificationException异常。

  pop方法稍微复杂些。首先,它必须决定在该列表中的最后一个元素,这是通过获得列表的大小并且减去1而得到的。

int last = list.size() - 1;

  如果这个结果是一个小于零的数字,那么该栈就是空的,因此pop方法就返回null。

if (last < 0) return null;

  如果在栈中存在最后一个元素,那么就从列表中检索它。在从列表中成功地检索这个项后,你可以把它删除。

T result = list.get(last);
list.remove(last);

  最后,返回从列表中检索的对象。

return result;

  为支持"for each"迭代,PeekableStack类的iterator方法返回一个"Java标准的"Iterator类-你可以用它来遍历包含在栈中的所有对象。iterator方法创建一个新的iterator并且返回之。

PeekableStackIterator peekableStackIterator=new
PeekableStackIterator(this, list);

  如你所见,该iterator类接收当前栈和栈的项目列表作为构造器参数。这些值将为PeekableStackIterator所用-下一节将讨论之。
0
相关文章