2

プロパティを設定するために使用されるそのクラスのメソッドを置き換えることにより、グルーヴィーなクラスのコンストラクターの動作を変更しようとしていますが、プロパティが期待値に設定されていません。

class TestClass {

    def noParam
    def withParam

    TestClass() {
        noParam = noParam()
        withParam = withParam('second test')
    }

    def noParam() {
        return 'first test'
    }

    def withParam(param) {
        return param
    }

}

TestClass.metaClass.withParam =  { param -> 'pass' }
TestClass.metaClass.noParam = {-> 'pass' }

def test = new TestClass()

assert test.withParam('dummy') == 'pass' //passes
assert test.withParam == 'pass' // fails
assert test.noParam() == 'pass' // passes
assert test.noParam == 'pass' // fails
4

1 に答える 1

1

noParamGroovy は、メソッドとメソッドを実行するときに、TestClass コンストラクターでメタクラスのオーバーライドを使用していませんwithParam。実際、withParamメソッドにパラメーターを入力すると、2 番目のアサートも失敗します。

class TestClass {

    def noParam
    def withParam

    TestClass() {
        noParam = noParam()
        withParam = withParam('second test')
        println "in the constructor: noParam = $noParam, withParam = $withParam"
    }

    def noParam() {
        return 'first test'
    }

    def withParam(String param) {
        return param
    }
}

TestClass.metaClass.withParam = { String param -> 'pass' }
TestClass.metaClass.noParam = {-> 'pass' }

def test = new TestClass()

assert test.withParam('dummy') == 'pass'
assert test.withParam  == 'pass' // this fails now too!
assert test.noParam() == 'pass'
assert test.noParam == 'pass' // this fails

出力は次のとおりです。in the constructor: noParam = first test, withParam = second test

test.withParamそしてtest.noParam実際に呼び出しtest.getWithParam()ておりtest.getNoParam()、コンストラクターで設定されたプロパティ値を返しています。

test.withParam('dummy')メタクラスメソッドをtest.noParam()呼び出して「パス」を返しています。

Groovy がコンストラクターでメタクラス メソッドを使用しない理由については、わかりません...メタクラスのドキュメントに何も見つかりませんでした...

代わりに静的メソッドを使用できますか?

class TestClass {

    def noParam
    def withParam

    TestClass() {
        noParam = TestClass.noParam()
        withParam = TestClass.withParam('second test')
        println "in the constructor: noParam = $noParam, withParam = $withParam"
    }

    static def noParam() {
        return 'first test'
    }

    static def withParam(String param) {
        return param
    }
}

TestClass.metaClass.'static'.withParam = { String param -> 'pass' }
TestClass.metaClass.'static'.noParam = {-> 'pass' }

def test = new TestClass()

assert test.withParam('dummy') == 'pass'
assert test.withParam  == 'pass' // passes!
assert test.noParam() == 'pass'
assert test.noParam == 'pass' // passes!

出力は次のとおりです。in the constructor: noParam = pass, withParam = pass

于 2013-06-14T21:53:47.293 に答える