EnumMapでget(String)

どうもbeanutilsがEnumMapに対応していないようだ。

enum HogeEnum{
    Hoge
}
    EnumMap map = new EnumMap<HogeEnum, String>(HogeEnum.class); 
    map.put(HogeEnum.Hoge, "HogeVal");

    System.out.println(map.get(HogeEnum.Hoge));
    System.out.println(map.get("Hoge"));
    System.out.println(PropertyUtils.getProperty(map, "Hoge"));

    System.out.println(PropertyUtils.getProperty(new LazyDynaMap(map), "Hoge"));
    //↓前回試したもの
    System.out.println(PropertyUtils.getProperty(new LazyDynaBean(new LazyDynaMap(map)), "Hoge"));


実行結果

HogeVal
null
null
null
java.lang.Object@145d068


Lazy系はさておいて、ではどうするか。
とりあえずEnumMapを拡張してbeanにしてみた。


・・・keyの妥当性チェックで引っ掛かります
EnumMap

    public V get(Object key) {
        return (isValidKey(key) ?
                unmaskNull(vals[((Enum)key).ordinal()]) : null);
    }


てことはちょっと面倒だけど、beanがMapを実装し、get()で誤魔化すか。
Mapのget(Object)を以下のように実装する。

public static class HogeBean implements Map{

    public Object get(Object key) {
        if(key instanceof String){
            key = (Object)HogeKeys.valueOf((String)key);
        }
        return getMap().get(key);
    }

    (略)
    EnumMap map = new EnumMap(HogeEnum.class);
    map.put(HogeEnum.Hoge, "HogeVal");

    HogeBean bean = new HogeBean(map);

    System.out.println(bean.get("Hoge"));
    System.out.println(PropertyUtils.getProperty(bean, "Hoge"));


実行結果

HogeVal
HogeVal


その他のMap実装が面倒といえばそうなのだが・・・。


はやいところbeanutilsが対応してくれないかなぁ。


#2006/10/03:一部修正