使用闭包在对象上调用一组方法

时间:2014-03-19 17:47:08

标签: groovy

我有一个名为Test的课程,我有以下代码

def test = new Test()
test.method1(args)
test.method2(args)

等等。我希望可以做到这样的事情,我可以在闭包中传递test对象的所有方法调用并使它们工作。像

test {
    method1(args)
    method2(args)
}

是否可以在groovy中这样做?

2 个答案:

答案 0 :(得分:5)

是的,有可能with Groovy:

test.with {
    method1 args
    method2 args
}

答案 1 :(得分:0)

Groovy会让你call a method using a GString代替标识符,所以如果你想拥有一个你在对象上调用的方法名称集合,你可以这样做:

def doTest(final object, final methods, final args) {
    methods.each { object."$it"(*args) }
}

final test = new Object() {
    void method1(final... args) { println "method1 $args" }
    void method2(final... args) { println "method2 $args" }
    void method3(final... args) { println "method3 $args" }
}

doTest test, [ 'method1', 'method2' ], [ 1, 2, 3 ]

Groovy也有passing maps to a function的一些语法糖,这可能很方便。如果您实际上不想使用相同的参数调用每个方法,则可以执行以下操作:

def doTest(final Map methods, final object) {
    methods.each { object."$it.key"(*it.value) }
}

doTest test, method1: [ 1, 2, 3 ], method2: [ 4, 5, 6 ]

如果您从CSV文件或类似的外部来源获取方法名称和值,我可以看到这样的内容很有用。