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