2

プロパティとコンストラクターを持つオブジェクトが与えられた場合、コンストラクター引数をプロパティにコピーしてから、コンストラクターで追加の作業を行います。

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

これにより、コンストラクターで他に何もしなければ、引数がプロパティに正常にコピーされますが、コンストラクターで「doSomething()」を呼び出すと、プロパティはコピーされません。

引数をプロパティにコピーするための「TheGroovy」の方法を探しています。

4

2 に答える 2

6

tim_yatesが述べたように、別のコンストラクターが定義されている場合、TupleConstructor AST変換は何もしません(このコード行= 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」(*)演算子を使用)。

残念ながら、TupleConstructor ASTトランスフォームには、タプルコンストラクターをプライベートとして追加するオプションがないようです。これは、この場合に役立ちます。

于 2012-05-04T16:24:03.323 に答える
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()

私が行方不明になっているより良い方法があるかもしれませんが

于 2012-05-04T15:10:20.457 に答える