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:一部修正