|
|
|
|
移动端

2.5.3 闭包委托

《Android Gradle权威指南》本书全面讲解了Android 下Gradle的详细用法,并结合实例,让读者达到学以致用的目的。本节为大家介绍闭包委托。

作者:飞雪无情来源:人民邮电出版社|2017-09-09 14:10

年前最后一场技术盛宴 | 1月27日与京东、日志易技术大咖畅聊智能化运维发展趋势!


2.5.3 闭包委托

Groovy闭包的强大之处在于它支持闭包方法的委托。Groovy的闭包有thisObject、owner、delegate三个属性,当你在闭包内调用方法时,由它们来确定使用哪个对象来处理。默认情况下delegate和owner是相等的,但是delegate是可以被修改的,这个功能是非常强大的,Gradle中的闭包的很多功能都是通过修改delegate实现的:

  1. task helloDelegate << {  
  2. new Delegate().test {  
  3. println "thisObject:${thisObject.getClass()}"  
  4. println "owner:${owner.getClass()}"  
  5. println "delegate:${delegate.getClass()}"  
  6. it.method1()  
  7. }  
  8. }  
  9. def method1(){  
  10. println "Context this:${this.getClass()} in root"  
  11. println "method1 in root"  
  12. }  
  13. class Delegate {  
  14. def method1(){  
  15. println "Delegate this:${this.getClass()} in Delegate"  
  16. println "method1 in Delegate"  
  17. }  
  18. def test(Closure<Delegate> closure){  
  19. closure(this)  
  20. }  

运行程序可以看到输出:

  1. thisObject:class build_e27c427w88bo0afju9niqltzf  
  2. owner:class build_e27c427w88bo0afju9niqltzf$_run_closure2  
  3. delegate:class build_e27c427w88bo0afju9niqltzf$_run_closure2  
  4. Context this:class build_e27c427w88bo0afju9niqltzf in root  
  5. method1 in root  
  6. Delegate this:class Delegate in Delegate  
  7. me thod1 in Delegate 

通过上面的例子我们发现,thisObject的优先级最高,默认情况下,优先使用thisObject来处理闭包中调用的方法,如果有则执行。从输出中我们也可以看到,这个thisObject其实就是这个构建脚本的上下文,它和脚本中的this对象是相等的。

从例子中也证明了delegate和owner是相等的,它们两个的优先级是:owner要比delegate高。所以闭包内方法的处理顺序是:thisObject>owner>delegate。

在DSL中,比如Gradle,我们一般会指定delegate为当前的it,这样我们在闭包内就可以对该it进行配置,或者调用其方法:

  1. task configClosure << {  
  2. person {  
  3. personName = "张三" 
  4. personAge = 20 
  5. dumpPerson()  
  6. }  
  7. }  
  8. class Person {  
  9. String personName  
  10. int personAge  
  11. def dumpPerson(){  
  12. println "name is ${personName},age is ${personAge}"  
  13. }  
  14. }  
  15. def person(Closure<Person> closure){  
  16. Person p = new Person();  
  17. closure.delegate = p 
  18. //委托模式优先  
  19. closure.setResolveStrategy(Closure.DELEGATE_FIRST);  
  20. closure(p)  

例子中我们设置了委托对象为当前创建的Person实例,并且设置了委托模式优先,所以,我们在使用person方法创建一个Person的实例时,可以在闭包里直接对该Person实例配置。有没有发现和我们在Gradle中使用task创建一个Task的用法很像,其实在Gradle中有很多类似的用法,在Gradle中也基本上都是使用delegate的方式使用闭包进行配置等操作。

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

数据库系统工程师考试全程指导

为了满足广大考生的需要,我们组织了参与过多年资格考试命题或辅导的教师,以新的考试大纲为依据,编写了《数据库系统工程师考试全程指导》...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊