倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

ちょっとお気に入りのコード

最近、ちょっとお気に入りの 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 コンテナなら「チョチョイノチョイ」(死語?)で書けそうな気がしてくるんですけど、いかが?

Groovyイン・アクション

Groovyイン・アクション