【发布时间】:2014-11-25 00:08:46
【问题描述】:
当一个代理在一个闭包中发生变化时,在 Groovy 中,当该闭包被克隆时会发生什么?
委托设置是否存在?
【问题讨论】:
当一个代理在一个闭包中发生变化时,在 Groovy 中,当该闭包被克隆时会发生什么?
委托设置是否存在?
【问题讨论】:
委托设置是否存在?
如果“生存”是指克隆将拥有相同的委托,那么答案是“是”。
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),那么正常的做法通常是克隆闭包,然后只改变克隆上的那些属性,使原始的属性保持原样。
【讨论】: