是否可以更改闭包的所有者?

net*_*ain 1 groovy

我在类A上有一个静态闭包,它将调用委托给B类.但是,当在A实例上向A上的静态闭包发出一个call()时,我似乎无法访问A上的实例属性.太令人惊讶,因为我正在使用静态闭包.解决此问题的一种方法是将实例化的A设置为闭包委托.但是,我需要将类B作为静态闭包的委托.

反正我是否可以更改静态闭包的所有者,所以它指向实例化的A类而不是静态?并保持B作为代表?或者这不可能吗?

tim*_*tes 5

你错了......你可以改变a的所有者Closure,但是它是多么可取,我不知道(因为setter是私有的,所以必须有这个原因).无论如何,这是一个例子:

// Define a Person, with a closure to return a property
class Person {
  String name
  int age
  Closure named = { -> "returned $name" }
}

// Define another Class with a similar property
class Furniture {
  String name
  int age
}

// Create our two objects
def tim = new Person( name:'tim', age:26 )
def chair = new Furniture( name:'chair', age:3 )

// Prints 'returned tim'
println tim.named()

// Add the closure from tim to the chair
chair.metaClass.named = tim.named
// Prints 'returned tim'
println chair.named()

// Change the owner to the chair instance
tim.named.@owner = chair
// prints 'returned chair'
println chair.named()
// prints 'returned chair'
println tim.named()
Run Code Online (Sandbox Code Playgroud)

如您所见,我们可以将所有者从Person类更改为Furniture类.

然而,在实践中,您可能希望设置关闭而不是所有者的委托,但是没有您想要实现的示例,不可能说这是否是您想要的