2

假设我有这个类:

class MyClass {
    int myInt

    MyClass(myInt) {
        this.myInt = myInt
    }

    def myMethod() {
        print this.myInt
    }
}

在某个地方我有:

def myClass1 = new MyClass(1)
def myMethodClosure = myClass1.&myMethod
def myClass2 = new MyClass(2)

现在,如果我调用myMethodClosure()它,它将调用将打印 1myMethod()myClass1实例。我想要的是调用相同myMethodClosure但在不同的实例上,在这种情况下,myClass2它可以打印 2。这可能吗?

我尝试过使用setDelegate(),但它不起作用。我还看到thisObject闭包类内部有字段,但它没有 setter,只有一个 getter。

4

2 回答 2

5

Groovy 中添加了两种方法来帮助闭包的序列化,dehydrate以及rehydrate. 基本上,它们剥离(并重建)闭包的owner,thisObjectdelegate. 在此示例中,您可以执行以下操作:

myMethodClosure.rehydrate( myClass2, myClass2, myClass2 )()

为了得到输出2,但是我会对这样做保持警惕,因为这不是该方法的目的,并且可能会产生严重的不可预见的后果。

更好的解决方案可能是编写一个工厂方法来获取给定实例的方法引用MyClass。可能还有其他更好的解决方案,但这取决于您所处的情况(我怀疑问题中的示例未显示)

于 2013-11-04T11:59:12.047 回答
2

我相信闭包“包括”要作用的封闭对象。在运行时不能在闭包内覆盖“this”。

于 2013-11-04T09:56:29.663 回答