noParam
Groovy は、メソッドとメソッドを実行するときに、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