再论列举器
我们此刻可以开始演示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。