2012-05-04 41 views
2

給定一個具有屬性和構造函數的對象,我希望將構造函數的參數複製到屬性中,然後在構造函數中做一些額外的工作。什麼是將參數複製到Groovy類中的屬性的Groovy方法?

import groovy.transform.TupleConstructor 

@TupleConstructor 
class Thing{ 
    def one 
    def two 

    public Thing(one, two){ 
     doSomething() 
    } 

    def doSomething(){ 
     println "doing something with one : $one and two: $two" 
    } 
} 


println new Thing(1, 2).dump() 

這將成功的ARGS複製到性能,如果我什麼都不要做,在構造函數中,但如果我叫「DoSomething的()」在構造函數中,屬性不會被複制。

我正在尋求「Groovy」方法來將args複製到屬性。

回答

6

由於tim_yates mentioned一個更好的方式,TupleConstructor AST轉換不會做任何事情,如果你有另一個構造函數定義(你可以指責代碼= P this line)。如果您需要在對象的建設運行一些其他的代碼,你可以添加在靜態工廠方法,並用這個來代替元組直接構造:

import groovy.transform.TupleConstructor 

@TupleConstructor 
class Thing { 
    def one 
    def two 

    def doSomething(){ 
     println "doing something with one : $one and two: $two" 
    } 

    static create(...args) { 
     def thing = new Thing(*args) 
     thing.doSomething() 
     thing 
    } 
} 


println Thing.create(1, 2).dump() 

請注意,我使用的是可變參數的靜態方法來接收任意數量的參數,然後用這些參數調用元組構造函數(爲此使用「spread」(*)運算符)。

不幸的是,TupleConstructor AST轉換似乎沒有將元組構造函數添加爲私有的選項,在這種情況下這很有用。

+0

+1不錯的選擇:-) –

4

如果您使用TupleConstructor,如果您定義了自己的構造函數,它將不會運行。

正如你已經定義了一個相同的構造函數的一個TupleConstructor將在字節碼生成,甚至做@TupleConstructor(force=true)不會幫你,你只會得到一個java.lang.ClassFormatError: Duplicate method name&signature in class file Thing

我可以在那一刻想到的最好的是做:

class Thing{ 
    def one 
    def two 

    public Thing(Map params){ 
     this.class.declaredFields.grep { !it.synthetic }.name.each { name -> 
     this[ name ] = params[ name ] 
     } 
     doSomething() 
    } 

    def doSomething(){ 
     println "doing something with one : $one and two: $two" 
    } 
} 


println new Thing(one:1, two:2).dump() 

雖然有可能是我失蹤

+0

另請參閱[此問題](http://stackoverflow.com/questions/9072307/copy-groovy-class-properties)和[此問題](http://stackoverflow.com/questions/7169601/how- to-assign-all-matching-properties-from-groovy-object-to-java-object)這與這個很相似...... –

+0

如果Thing擴展了某些東西,它也不會工作,因爲它不會看到繼承的屬性 –