2011-07-18 73 views
0

在Javascript中你可以用性能的定義對象和b像這樣:Groovy的:在飛行性能

myObj={a:'a',b:'b'} 

,然後你可以添加一個性質C像這樣

myObj.c = 'c' 

什麼的相當於Groovy的?我必須使用metaClass嗎?

使用案例:Grails中的JSON轉換器不會爲響應添加瞬態屬性,我只想將隨機屬性附加到我的對象列表的每個元素。

回答

3

可以使用Map,它具有類似的語法和行爲:

def myObj [a:'a', b:'b'] 
myObj.c = 'c' 

您還可以將與瓶蓋的行爲,例如

myObj.sayHello = { -> println 'Hi' } 

,然後調用它像一個方法:

myObj.sayHello() 
+0

如果我們正在談論一個Domain類,那麼我不能使用Map來做這件事。我想向列表中的每個成員添加一個屬性。 – dbrin

+0

向列表中的每個成員添加屬性無非是一張地圖(鍵值對) –

3

Using methodMissing and propertyMissing報價:

Groovy還支持propertyMissing用於處理財產的分辨率嘗試。對於一個getter您使用propertyMissing定義,需要一個String參數:

class Foo { 
     def propertyMissing(String name) { name } 
    } 
    def f = new Foo() 

    assertEquals "boo", f.boo 

對於制定者添加第二個propertyMissing定義,需要一個值參數:

class Foo { 
    def storage = [:] 
    def propertyMissing(String name, value) { storage[name] = value } 
    def propertyMissing(String name) { storage[name] } 
} 
def f = new Foo() 
f.foo = "bar" 

assertEquals "bar", f.foo 

與methodMissing你可能會希望在運行時動態註冊新屬性以提高代碼的性能。

+0

Steve,謝謝發貼。我有2個問題。 1.因爲Foo已經有一個地圖屬性存儲,你可以設置f.storage.foo ='bar'。 2我不認爲我想用propertyMissing方法來裝飾我所有的grails域類。這感覺很沉重。我仍在尋找更優雅的解決方案。 – dbrin

+0

不錯。愛那個時髦的X-Missing。 – Nicholas

+0

@DmitryB:1)是的,您可以在該示例中訪問f.storage.foo。但是,您也可以訪問f.foo,這正是我認爲您想要做的。 2)你可以玩使用類別來應用propertyMissing方法到你的每個域名。 –