关闭委托克隆时会发生什么?

时间:2014-11-25 00:08:47

标签: groovy closures

当一个委托在一个闭包中被改变时,在Groovy中,当克隆该闭包时会发生什么?

委托设置是否存在?

1 个答案:

答案 0 :(得分:2)

  

委托设置是否存在?

如果通过“生存”你的意思是克隆将具有相同的代表,那么答案是“是”。

groovy:000> c = {
groovy:001>     append 'Hello'
groovy:002> }
===> groovysh_evaluate$_run_closure1@31e033f0
groovy:000> 
groovy:000> c.delegate = new StringBuffer()
===> 
groovy:000> d = c.clone()
===> groovysh_evaluate$_run_closure1@7970c11a
groovy:000> 
groovy:000> c.delegate
===> 
groovy:000> d.delegate
===> 
groovy:000> c()
===> Hello
groovy:000> c.delegate
===> Hello
groovy:000> d.delegate
===> Hello
groovy:000> d.delegate.append 'Goodbye'
===> HelloGoodbye
groovy:000> c.delegate
===> HelloGoodbye
groovy:000> d.delegate
===> HelloGoodbye
groovy:000> 

根据具体情况,如果你编写一个接受闭包的方法并且你的方法将修改闭包的状态(比如修改委托或resolveStrategy),那么通常要做的事情是正确的做法通常是克隆闭包然后只改变克隆上的那些属性,使原始的属性与传递时一样。