列挙子の実装を反復子のインタフェイスで扱う #3

EnumerationにとってのIterableはないためenumeration(Iterable)に相当するものは作れないが、
対称性を考えてEnumerationからIterableを生成するiterableメソッドを書いてみる。
メソッドは#1のiteratorメソッドと同じクラス内で定義する。

import java.util.Enumeration;
import java.util.Iterator;
...snip
    private static <E> Iterator<E> iterator_(Enumeration<E> enumeration) {
        return iterator(enumeration);
    }

    public static <E> Iterable<E> iterable(final Enumeration<E> enumeration) {
        return new Iterable<E>() {
            public Iterator<E> iterator() {
                return iterator_(enumeration);
            }
        };
    }
...snip

単にiterator(Enumeration)を呼び出してIteratorを返すiterator()を持つIterableの実装クラスを返しているだけである。
仲介メソッドiterator_(Enumeration)は先述の通り、
アウタークラスと同名異シグニチャのメソッドを定義している匿名クラスのそのメソッドから、
アウタークラスのメソッドを呼び出すための仕掛けである。
もちろん、メソッド呼び出しにアウタークラスの名前を明示すれば、こんな面倒なことは不要である。
また、JDK7(1.7.0_01)の例の不思議な振る舞いを利用できる状況であるのならば、
次のように匿名クラスを定義することで仲介メソッドを定義する必要がなくなることはなくなるのだが。

    public static <E> Iterable<E> iterable(final Enumeration<E> enumeration) {
        return new Iterable<E>() {
            public Iterator<E> iterator() {
                return iterator(enumeration);
            }
            private void iterator(int dummy) {}
        };
    }

匿名クラス内のiterator()はIterableインタフェイスを実装するために必要なメソッドであるから名前を変更できない。
また、アウタークラスで定義したiterator(Enumeration)はIteratorを返すメソッドとして分かりやすい名前であり、
Iterableのiteratorメソッドに通じることから変更したくない。
また、アウタークラスの名前をここではあえて明示していないことから、仲介メソッドのような面倒な記述にしている。