给定一个具有属性和构造函数的对象,我希望将构造函数参数复制到属性中,然后在构造函数中执行一些额外的工作。
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复制到属性。
答案 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()
虽然可能有一种更好的方法,但我