方法指针和对象引用

时间:2016-02-16 07:22:07

标签: groovy

Groovy存储对class方法中使用的变量的引用,我将其转换为闭包。

在这个例子中

class Accumulator {
    def count = 0

    def accumulate() {
        print (++count)
    }
}

def ac_inst= new Accumulator()
3.times {
    ac_inst.accumulate() //123
}
def accum = ac_inst.&accumulate
ac_inst = 5 // changed reference

8.times {
    accum() //4567891011
}

我使用accum对象的方法accumulate创建了封闭ac_inst - MyClass的实例。

我将ac_inst值更改为完全不同的对象,但是闭包调用继续增加count值,尽管不再有ac_inst个对象。

它存储该闭包所需的值?

2 个答案:

答案 0 :(得分:2)

一个闭包有一个delegate(可以修改)和一个owner(严格来说不能)

所以它所涉及的实例存储在这里,只是改变它原来的值并不会改变它。

事实上,我能想到的几乎所有语言都是如此:

def list = [1,2,3]
def val = list[1]

list = [4,5,6]
println val // still 2

答案 1 :(得分:2)

当你写def accum = ac_inst.&accumulate时,groovy创建一个MethodClosure的实例(而不是一个覆盖Closure的新类)

此对象将实例存储在owner字段中,方法名称存储在method属性中。这不是'真正的封闭',call()只委托给他的主人。 owner无法更改 - 它是常量 - 而delegate可以。

请参阅MethodClosure.java