最近、ちょっとお気に入りの Groovy コード。
def pojo = ... def props = [name1:'value1', name2:'value2', name3:'value3'] props.each{ String name, value -> if(pojo.hasProperty(name)){ pojo[name] = value } }
単に pojo オブジェクトに Map からプロパティを注入してるだけなんですけどね。 プロパティが何十個あろうが、何百個あろうがこの数行だけで OK (プロパティの作成は大変だけど)なのがエレガントゥ! プロパティが多いオブジェクトなどを使うときに、ちょっとだけ値を変えて試してみたいときなどに重宝。 プロパティの作成には、マップ展開演算子 「*:」を使えば使い回しができるのも便利。
上記のコードだけでもすごく便利ですが、プロパティを XML ファイルやプロパティファイルに保存している場合、読み出したときにプロパティの値が String オブジェクトになっているので、上記のコードだけではうまくいきません。 ただし、値が数値のような簡単な型の場合(正確には String#asType() がサポートしている型の場合)には、1行+αを加えるだけでうまくいきます:
def pojo = ... def props = [name1:'value1', name2:'value2', name3:'value3'] props.each{ String name, value -> if(pojo.hasProperty(name)){ def type = pojo.metaClass.getMetaProperty(name).type pojo[name] = value.asType(type) } }
これらを見てると、簡単な DI コンテナなら「チョチョイノチョイ」(死語?)で書けそうな気がしてくるんですけど、いかが?
- 作者: Dierk Konig,Andrew Glover,Paul King,Guillaume Laforge,Jon Skeet,杉浦孝,櫻井正樹,須江信洋,関谷和愛,佐野徹郎,寺沢尚史
- 出版社/メーカー: 毎日コミュニケーションズ
- 発売日: 2008/09/27
- メディア: 単行本(ソフトカバー)
- 購入: 5人 クリック: 146回
- この商品を含むブログ (121件) を見る