2009-09-03 10 views
4

クラスのあるインスタンスから別のクラスのインスタンスのプロパティ(2つの共通フィールド)にプロパティをバインドする方法はありますか?下の例を参照してください:Groovy - あるオブジェクトから別のオブジェクトへのプロパティのバインド

class One { 
    String foo 
    String bar 
} 

class Two { 
    String foo 
    String bar 
    String baz 
} 

def one = new One(foo:'one-foo', bar:'one-bar') 
def two = new Two() 

two.properties = one.properties 

assert "one-foo" == two.foo 
assert "one-bar" == two.bar 
assert !two.baz 

結果が誤りである:読み取り専用プロパティを設定できません:クラスのプロパティ:二

答えて

7

問題は、オブジェクトごとに.properties内蔵のGroovy-定義された2つが含まれていることですのプロパティは、metaClassclassです。あなたがしたいのは、ユーザ定義ののプロパティのみを設定することです。あなたは簡単に、以下に示すように、この使用してコードを実行できます。

class One { 
    String foo 
    String bar 
} 

class Two { 
    String foo 
    String bar 
    String baz 
} 

def one = new One(foo:'one-foo', bar:'one-bar') 

// You'll probably want to define a helper method that does the following 3 lines for any Groovy object 
def propsMap = one.properties 
propsMap.remove('metaClass') 
propsMap.remove('class') 

def two = new Two(propsMap) 

assert "one-foo" == two.foo 
assert "one-bar" == two.bar 
assert !two.baz 
+0

私は一般的なアプローチについて興味があります。私は、データウェアハウスに接続しているWebアプリを持っています。ウェブアプリケーションのドメインは、倉庫から来るテーブルやデータとはまったく異なります。私はおそらく上記の技術をサービスレイヤーで使用するつもりですが、レガシーオブジェクトをドメインオブジェクトに変換する役割を担う追加のレイヤーを持つことをお勧めしますか? – ontk

+0

これは、bazプロパティが1に定義されていないため、逆に働きません – dbrin

7

私はhereをsuggesedとして、私はInvokerHelper.setPropertiesを選ぶだろう。

use(InvokerHelper) { 
    two.setProperties(one.properties) 
} 
+0

これは 'metaClass'と' class'プロパティを安全に処理しますか?私はそれらを上書きしないという意味ですか? – Nikem

関連する問題