Gradle系列之Groovy基础篇 (2)

下面是上述代码参考如下:

PS E:\Gradle\study\Groovy\Method> gradle method > Configure project : 3 3 30 获取方法返回的结果:30 1 2 3 4 5 BUILD SUCCESSFUL in 2s JavaBean

Groovy 中的 JavaBean 相较 Java 中的比较灵活,可以直接使用 javaBean.属性的方式获取和修改 JavaBean 的属性值,无需使用相应的 Getter、Setter 方法,直接看代码:

task javaBean{ //Groovy中定义JavaBean Student student = new Student() student.name = "Groovy" student.age = 10 student.setName("Gradle") println "名字是:"+student.name //不能调用Getter方法获取值 // println "名字是:"+student.getName println "年龄是:${student.age}" println "分数是:"+student.score } class Student{ private String name private int age //定义的Getter方法所对应的属性可以直接调用 public String getScore(){ 100 } //属性的Getter、Setter方法 public String setName(String name){ this.name = name } public void getName(){ name } }

下面是上述代码的执行结果:

PS E:\Gradle\study\Groovy\JavaBean> gradle javaBean > Configure project : 名字是:Gradle 年龄是:10 分数是:100 BUILD SUCCESSFUL in 2s 闭包

闭包是大多数脚本语言具有的一个特性,如 JavaScript、Groovy 等,闭包就是一个使用花括号包围的代码块,下面来学习 Groovy 中的闭包,主要有两部分:闭包及闭包参数传递和闭包委托。

闭包及其参数传递

下面来看一下如何定义一个闭包以及相关参数的传递,直接上代码:

task closure{ //自定义闭包的执行 mEach{ println it } //向闭包传递参数 mEachWithParams{m,n -> //m,n ->将闭包的参数和主体区分离开来 println "${m} is ${n}" } } //1.定义一个方法,参数closure用于接收闭包 //2.闭包的执行就是花括号里面代码的执行 //3.闭包接收的参数就是闭包参数closure参数中的i,如果是一个参数默认就是it变量 def mEach(closure){ for(int i in 1..5){ closure(i) } } //向闭包传递参数 def mEachWithParams(closure){ def map = ["name":"Groovy","age":10] map.each{ closure(it.key, it.value) } }

上面代码中定义了闭包以及如何进行闭包的参数的传递,当闭包只有一个参数时,默认就是 it,反之闭包有多个参数时,就需要将参数定义出来,具体可参考上述代码,下面是执行结果:

PS E:\Gradle\study\Groovy\Closure> gradle delegate > Configure project : 1 2 3 4 5 name is Groovy age is 10 BUILD SUCCESSFUL in 2s 闭包委托

Groovy 闭包的强大之处在于它支持闭包方法的委托,Groovy 的闭包有三个属性:thisObject、owner、delegate,当在一个闭包中调用定义的方法时,由这三个属性来确定该方法由哪个对象来执行,默认 owner 和 delegate 是相等的,其中 delete 是可以被修改的,Gradle 中闭包的很多功能都是通过修改 delegate 来实现的。下面通过定义一个闭包以及方法,通过打印来说明这三个属性的一些区别:

//闭包的委托 task delegate{ new Delegate().test{ //Groovy闭包的三个属性:thisObject、owner、delegate println "thisObject:${thisObject.getClass()}" println "owner:${owner.getClass()}" println "delegate:${delegate.getClass()}" //闭包默认it println "闭包默认it:"+it.getClass() //定义的方法,优先使用thisObject来处理 method() //闭包中的方法 it.method() } } def method(){ println "mththod in root:${this.getClass()}" } class Delegate{ def method(){ println "mththod in Delegate:${this.getClass()}" } //闭包 def test(Closure<Delegate> closure){ closure(this); } }

下面是上述代码的执行结果,参考如下:

PS E:\Gradle\study\Groovy\Closure> gradle delegate > Configure project : thisObject:class build_3ajca04o1rprxygcsq0ajvt7i owner:class build_3ajca04o1rprxygcsq0ajvt7i$_run_closure2 delegate:class build_3ajca04o1rprxygcsq0ajvt7i$_run_closure2 闭包默认it:class Delegate mththod in root:class build_3ajca04o1rprxygcsq0ajvt7i mththod in Delegate:class Delegate BUILD SUCCESSFUL in 2s

当在闭包中调用方法 method() 时,发现是 thisObject 调用了 method() 方法,而不是 owner 或 delegate,说明闭包中优先使用 thisObject 来处理方法的执行,同时可以看到 owner 和 delegate 是一致的,但是 owner 比 delegate 的优先级要高,所以闭包中方法的处理顺序是:thisObject > owner > delegate。

Gradle 中一般会指定 delegate 为当前的 it,这样我们将可以通过 delegate 指定的对象来操作 it 了,下面指定闭包的 delegate 并设置委托优先,让委托的具体对象来执行其方法,下面是测试代码:

task student{ configStudent{ println "当前it:${it}" name = "Groovy" age = 10 getInfo() } } class Student{ String name int age def getInfo(){ println "name is ${name}, age is ${age}" } } def configStudent(Closure<Student> closure){ Student student = new Student() //设置委托对象为当前创建的Student实例 closure.delegate = student //设置委托模式优先,如果不设置闭包内方法的处理者是thisObject closure.setResolveStrategy(Closure.DELEGATE_FIRST) //设置it变量 closure(student) }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwxwfy.html