我們現在可以開始演示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。