再论列举器
我们此刻可以开始演示Enumeration(列举)的真正威力:将穿越一个序列的操纵与谁人序列的基本布局脱离开。在下面的例子里,PrintData类用一个Enumeration在一个序列中移动,并为每个工具都挪用toString()要领。此时建设了两个差异范例的荟萃:一个Vector和一个Hashtable。而且在它们内里别离填充Mouse和Hamster工具(本章早些时候已界说了这些类;留意必需先编译HamsterMaze.java和WorksAnyway.java,不然下面的措施不能编译)。由于Enumeration埋没了下层荟萃的布局,所以PrintData不知道可能不体贴Enumeration来自于什么范例的荟萃:
//: Enumerators2.java // Revisiting Enumerations import java.util.*; class PrintData { static void print(Enumeration e) { while(e.hasMoreElements()) System.out.println( e.nextElement().toString()); } } class Enumerators2 { public static void main(String[] args) { Vector v = new Vector(); for(int i = 0; i < 5; i++) v.addElement(new Mouse(i)); Hashtable h = new Hashtable(); for(int i = 0; i < 5; i++) h.put(new Integer(i), new Hamster(i)); System.out.println("Vector"); PrintData.print(v.elements()); System.out.println("Hashtable"); PrintData.print(h.elements()); } } ///:~
留意PrintData.print()操作了这些荟萃中的工具属于Object类这一事实,所以它挪用了toString()。但在办理本身的实际问题时,常常都要担保本身的Enumeration穿越某种特定范例的荟萃。譬喻,大概要求荟萃中的所有元素都是一个Shape(几许形状),并含有draw()要领。若呈现这种环境,必需从Enumeration.nextElement()返回的Object举办下溯造型,以便发生一个Shape。