2009-09-03 139 views
4

有沒有辦法將屬性從一個類的實例綁定到另一個類的實例的屬性(兩者之間的通用字段)。看下面的例子: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的定義屬性,這些是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 2012-06-07 17:45:27

+0

由於baz屬性沒有定義在一個 – dbrin 2015-03-12 00:30:23

7

我會選擇InvokerHelper.setProperties我suggesed here

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

這是否反過來工作這是否安全地處理'metaClass'和'class'屬性?我的意思是,不會覆蓋他們? – Nikem 2016-01-07 14:58:49

相關問題