Enumeration は、あるオブジェクトに属するある要素を、すべて枚挙して数え上げる 時に用いられます。例えば、Vector v の全ての要素を表示するには、次のような プログラムが使われます。
for( Enumeration e = v.elements(); e.hasMoreElements(); ){ System.out.println(e.nextElement()); }
ここで、 Enumeration e = v.elements() という部分に注目して下さい。イメージと しては、e に vの要素がすべて枚挙されたものが入れられるのだと、考えていいと思い ます。そして、eに対して、メソッドnextElement()が働くたびに、先頭の要素が取り 出され、eは、その分だけ短くなってゆきます。メソッド hasMoreElements() は、まだ 要素が残っているかをチェックします。
少し、紛らわしいのですが、Enumerationは、クラスではなくインターフェースです。 Vector classの中で、elements()というメソッドがどのように、定義されているのかを 見てみると、次のようになっています。
public final syncronized Enumeration elements(){ return new VectorEnumerator(this); }
メソッド elements()は、要するに、クラス VectorEnumerator に属するインスタンス を返すのですが、このクラス VectorRnumerator が、Enumeration インターフェース を持っているのです。
Enumeration インターフェースを持つクラスは、必ず、次の二つのメソッドを 実装しなければなりません。
public boolean hasMoreElements() ; public Object nextElement();
HashTableの場合にも、次のような形で、HashTable h に含まれる要素の枚挙が 出来ます。これは、先のVectorの要素の枚挙と全く同じ形をしています。
for( Enumeration e = h.elements(); e.hasMoreElements(); ){ System.out.println(e.nextElement()); }
ところで、HashTableの場合には、要素の枚挙ではなく、キーを枚挙するということも 必要になります。この時は、先の elements()の部分を、keys()に置き換えたものが 役に立ちます。
for( Enumeration e = h.keys(); e.hasMoreElements(); ){ System.out.println(e.nextElement()); }
この、メソッドelements(), keys()の定義は次のようになっています。
public final syncronized Enumeration elements(){ return new HashtableEnumerator(table,false); } public final syncronized Enumeration keys(){ return new HashtableEnumerator(table,true); }
ここでも、HashtableEnumerator が、インターフェース Enumeration を 実装したクラスになっています。