反復子の実装を列挙子のインタフェイスで扱う #3
#1の最初のコードを汎用的にする。
import java.util.Enumeration; import java.util.Iterator; ...snip public static <E> Enumeration<E> enumeration(final Iterator<E> iterator) { return new Enumeration<E>() { private Iterator<E> iter = iterator; public boolean hasMoreElements() { return iter.hasNext(); } public E nextElement() { return iter.next(); } }; } public static <E> Enumeration<E> enumeration(Iterable<E> iterable) { return enumeration(iterable.iterator()); } ...snip
Iteratorを引数にとってEnumerationを返すクラスメソッドにした。
ついでにこのメソッドを内部で呼び出すようにして、Iterableを引数にとってEnumerationを返すものも定義した。
これはCollections.enumeration(Collection)よりも汎用的で、引数はIterableであればよい。もちろんCollectionでもよい。
使い方は、
import java.util.Arrays; ...snip Enumeration<String> e = enumeration(Arrays.asList("Alice", "Bob", "Carol").iterator());
で、渡されたIteratorに対応したEnumerationが返される。
ここではenumerationメソッドが定義されているクラス内で呼び出しているためメソッド名だけだが、
他のクラスから呼び出すならもちろん「enumerationメソッドが定義されているクラス名」.enumeration()とする。
Enumeration<String> e = enumeration(Arrays.asList("Alice", "Bob", "Carol"));
で、Iterableの一種であるListを渡して対応するEnumerationを受け取れる。