在任何集合類中
若從更高的角度看這個問題
可利用
Java的Enumeration(枚舉
(
(
(
②
只可用Enumeration做這些事情
//: CatsAndDogs
// Simple collection with Enumeration
import java
class Cat
private int catNumber;
Cat
catNumber = i;
}
void print() {
System
}
}
class Dog
private int dogNumber;
Dog
dogNumber = i;
}
void print() {
System
}
}
public class CatsAndDogs
public static void main(String[] args) {
Vector cats = new Vector();
for(int i =
cats.addElement(new Cat2(i));
// Not a problem to add a dog to cats:
cats.addElement(new Dog2(7));
Enumeration e = cats.elements();
while(e.hasMoreElements())
((Cat2)e.nextElement()).print();
// Dog is detected only at run-time
}
} ///:~
我們看到唯一的改變就是最後幾行。tW.WinGWIt.CoM不再是:
for(int i = 0; i < cats.size(); i++)
((Cat)cats.elementAt(i)).print();
而是用一個Enumeration遍歷整個序列:
while(e.hasMoreElements())
((Cat2)e.nextElement()).print();
使用Enumeration,我們不必關心集合中的元素數量。所有工作均由hasMoreElements()和nextElement()自動照管了。
下面再看看另一個例子,讓我們創建一個常規用途的打印方法:
//: HamsterMaze.java
// Using an Enumeration
import java.util.*;
class Hamster {
private int hamsterNumber;
Hamster(int i) {
hamsterNumber = i;
}
public String toString() {
return "This is Hamster #" + hamsterNumber;
}
}
class Printer {
static void printAll(Enumeration e) {
while(e.hasMoreElements())
System.out.println(
e.nextElement().toString());
}
}
public class HamsterMaze {
public static void main(String[] args) {
Vector v = new Vector();
for(int i = 0; i < 3; i++)
v.addElement(new Hamster(i));
Printer.printAll(v.elements());
}
} ///:~
仔細研究一下打印方法:
static void printAll(Enumeration e) {
while(e.hasMoreElements())
System.out.println(
e.nextElement().toString());
}
注意其中沒有與序列類型有關的信息。我們擁有的全部東西便是Enumeration。為了解有關序列的情況,一個Enumeration便足夠了:可取得下一個對象,亦可知道是否已抵達了末尾。取得一系列對象,然後在其中遍歷,從而執行一個特定的操作——這是一個頗有價值的編程概念,本書許多地方都會沿用這一思路。
這個看似特殊的例子甚至可以更為通用,因為它使用了常規的toString()方法(之所以稱為常規,是由於它屬於Object類的一部分)。下面是調用打印的另一個方法(盡管在效率上可能會差一些):
System.out.println("" + e.nextElement());
它采用了封裝到Java內部的“自動轉換成字串”技術。一旦編譯器碰到一個字串,後面跟隨一個“+”,就會希望後面又跟隨一個字串,並自動調用toString()。在Java 1.1中,第一個字串是不必要的;所有對象都會轉換成字串。亦可對此執行一次造型,獲得與調用toString()同樣的效果:
System.out.println((String)e.nextElement())
但我們想做的事情通常並不僅僅是調用Object方法,所以會再度面臨類型造型的問題。對於自己感興趣的類型,必須假定自己已獲得了一個Enumeration,然後將結果對象造型成為那種類型(若操作錯誤,會得到運行期違例)。
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19750.html