【Groovy】闭包 Closure ( 闭包类 Closure 简介 | this、owner、delegate 成员区别 | 静态闭包变量 | 闭包中定义闭包 )(一)

文章目录

总结

一、静态闭包变量

1、执行普通闭包变量

2、执行静态闭包变量

二、 在闭包中定义闭包

三、 完整代码示例

总结


在闭包中 , 打印 this , owner , delegate , 打印结果都是创建闭包时所在的类 ;


如果在类中创建闭包 , 则打印结果是类 ;

如果在实例对象中创建闭包 , 则打印结果是实例对象 ;

如果在闭包 A 中创建 闭包 B , this 是最外层闭包 A 之外的类 , owner , delegate 是上一层闭包 B ;





一、静态闭包变量



1、执行普通闭包变量


在类中定义闭包变量 , 在闭包中打印 this、owner、delegate 值 ,


class Test2 {
    def closure = {
        println "this : " + this
        println "owner : " + owner
        println "delegate : " + delegate
    }
}


执行上述 Test2 类中的闭包 ,


new Test2().closure()


打印结果如下 : 打印的值都是 Test2 实例对象 ;


this : Test2@5082d622
owner : Test2@5082d622
delegate : Test2@5082d622



2、执行静态闭包变量


如果将闭包声明为静态变量 ,


class Test2 {
    def static closure = {
        println "this : " + this
        println "owner : " + owner
        println "delegate : " + delegate
    }
}


直接使用闭包所在类直接调用闭包 , 不再使用闭包所在类对象调用闭包 ;


Test2.closure()


执行结果为 : 打印的值都是 Test2 类 ;


this : class Test2
owner : class Test2
delegate : class Test2



还是上述静态闭包变量 , 使用 Test2 实例对象调用 ,


new Test2().closure()


打印的结果是创建闭包时所在的类 ;


this : class Test2
owner : class Test2
delegate : class Test2






二、 在闭包中定义闭包


在 Test2 类中定义 闭包变量 closure2 , 在 closure2 闭包中定义 closure3 闭包 ,


class Test2 {
    def closure2 = {
        def closure3 = {
            println "this : " + this
            println "owner : " + owner
            println "delegate : " + delegate
        }
        closure3()
    }
}


打印结果如下 :


this : Test2@291a7e3c
owner : Test2$_closure1@4ae9cfc1
delegate : Test2$_closure1@4ae9cfc1


this 值为 外部的 Test2 实例对象 ;


owner 和 delegate 是 Test2 中定义的 closure2 闭包 ;



创建 closure2 闭包时 , this、owner、delegate 都是 Test2 实例对象 ;


但是创建 closure3 闭包时 , this 的值还是设置 closure2 的 this 值 , owner、delegate 值设置成 closure2 闭包 ;


  // 创建内层闭包时 , 传入的 this 是 外层闭包的 this.getThisObject()

// 创建内层闭包时 , 传入的 this 是 外层闭包的 this.getThisObject() 
    // 因此 this 值仍是 Test2 实例对象 
    // owner、delegate 变为外层的 Closure 闭包 ; 
            Object closure3 = new _closure2(this, this.getThisObject());

 


上一篇:【错误记录】BLE 蓝牙搜索失效 ( 关闭了 GPS 定位导致的问题 | 蓝牙串口工具推荐 )


下一篇:【Groovy】Groovy 方法调用 ( Groovy 构造函数中为成员赋值 | Groovy 函数的参数传递与键值对参数 | 完整代码示例 )