next up previous contents
Next: 演習課題 Up: Utility classes Previous: Vector

Enumeration

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の場合にも、次のような形で、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 を 実装したクラスになっています。



maruyama@wakhok.ac.jp