【IT168 技术文档】本篇将讲解一下closure中的owner,以及this,delegate以及owner三者间的关系。
先让我们来看个例子:
class OwnerDemo { def outerClosure = { println "the owner of outerClosure: " + owner def innerClosure = { println "the owner of innerClosure: " + owner def innestClosure = { println "the owner of innestClosure: " + owner } innestClosure() } innerClosure() } } def ownerDemo = new OwnerDemo() ownerDemo.outerClosure()
运行结果:
the owner of outerClosure: OwnerDemo@eccfe7
the owner of innerClosure: OwnerDemo$_closure1@4745cf
the owner of innestClosure: OwnerDemo$_closure1_closure2@109dcbb
注意:OwnerDemo$_closure1指的是outerClosure的类名,而OwnerDemo$_closure1_closure2指的是innerClosure的类名
通过这个例子,大家就清楚了,closure的owner引用的是该closure的‘拥有者’
那么this, delegate以及owner有什么关系呢?
隐式变量delegate的默认值为owner,
如果closure没有‘嵌套’在其他closure中,那么该closure的owner的值为this;
否则该closure的owner引用的是‘直接包含’该closure的closure
让我们用事实来说话吧:
class OwnerDemo { def outerClosure = { println "the owner of outerClosure: " + owner println "the delegate of outerClosure: " + delegate println "this in the outerClosure: " + this def innerClosure = { println "the owner of innerClosure: " + owner println "the delegate of innerClosure: " + delegate println "this in the innerClosure: " + this def innestClosure = { println "the owner of innestClosure: " + owner println "the delegate of innestClosure: " + delegate println "this in the innestClosure: " + this } println "innestClosure: " + innestClosure innestClosure() } println "innerClosure: " + innerClosure innerClosure() } } def ownerDemo = new OwnerDemo() def outerClosure = ownerDemo.outerClosure println "outerClosure: " + outerClosure outerClosure()
运行结果:
outerClosure: OwnerDemo$_closure1@10cc9b4
the owner of outerClosure: OwnerDemo@8e7f54
the delegate of outerClosure: OwnerDemo@8e7f54
this in the outerClosure: OwnerDemo@8e7f54
innerClosure: OwnerDemo$_closure1_closure2@1eb1db2
the owner of innerClosure: OwnerDemo$_closure1@10cc9b4
the delegate of innerClosure: OwnerDemo$_closure1@10cc9b4
this in the innerClosure: OwnerDemo@8e7f54
innestClosure: OwnerDemo$_closure1_closure2_closure3@12a78ee
the owner of innestClosure: OwnerDemo$_closure1_closure2@1eb1db2
the delegate of innestClosure: OwnerDemo$_closure1_closure2@1eb1db2
this in the innestClosure: OwnerDemo@8e7f54
大家可以从其中值的关系看出this, delegate以及owner三者的关系与我们之前所说的相符 :)