HashMapのキーをEnumerationに変換する

JUnit で単体試験を行うにあたり、HttpSession のスタブを作ろうとしてハマったのでメモ。

HttpSession インターフェースを継承する場合は Enumeration型を返却するメソッド getAttributeNames() を実装する必要がある。

試験用の使い捨て部品なので、中身の値は HashMap で持たせるという簡単仕様で作ろうと考えていた。もちろん、 getAttribute(String) とか settAttribute(String, Object) とかは普通に作れる。しかし、 getAttributeNames() を作ろうとすると…

public class HttpSessionImplTest implements HttpSession {
    private Map map;

    public HttpSessionImplTest() {
        map = new HashMap();
    }
    public Object getAttribute(String name) {
        return map.get(name);
    }

    public void setAttribute(String name, Object value) {
        map.put(name, value);
    }

    public Enumeration getAttributeNames() {
        Set keys = map.keySet();
        return keys;  // 型が一致しない→エラー
    }

    // 以下略
}

Map#keySet() でキーのコレクションは取得できるものの、残念なことに戻り値が Set型。Enumerationを実装しているクラスがあればいいんだろうけど、探しても見当たらず。

いろいろ調べた末に、 Collections#enumeration(Collection) が正解であることが判明。

Enumeration<String> en = Collections.enumeration(map.keySet());

これでコレクションを列挙型に変換することが可能。

    public Enumeration getAttributeNames() {
        Set keys = map.keySet();
        return Collections.enumeration(map.keySet());
    }

これでよし。

Javaの初歩的なところでハマってしまった…


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>