将参数复制到Groovy类中的属性的Groovy方法是什么?

时间:2012-05-04 14:57:16

标签: groovy constructor

给定一个具有属性和构造函数的对象,我希望将构造函数参数复制到属性中,然后在构造函数中执行一些额外的工作。

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复制到属性。

2 个答案:

答案 0 :(得分:6)

作为tim_yates mentioned,如果你定义了另一个构造函数,那么TupleConstructor AST转换将不会做任何事情(你可以责怪this line代码= P)。如果您需要在构造对象时运行其他代码,您可以在静态工厂方法中添加它并直接使用它而不是元组构造函数:

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”(*)运算符)。 / p>

不幸的是,TupleConstructor AST转换似乎没有将元组构造函数添加为private的选项,这在这种情况下很有用。

答案 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()

虽然可能有一种更好的方法,但我