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

简介: 【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());

 


目录
相关文章
|
6月前
|
JavaScript 前端开发 数据安全/隐私保护
闭包对于保护私有变量和函数的作用
JavaScript中的闭包用于创建私有作用域,保护变量和函数不被外部直接访问。它们实现封装和信息隐藏,防止全局命名冲突,确保数据安全和稳定性。闭包还支持访问控制和持久状态保持,常用于模块化、数据隐藏等,增强代码的可维护性、可重用性和安全性。
|
6月前
|
缓存 JavaScript 前端开发
|
6月前
|
开发框架 .NET 编译器
C# 9.0中的静态匿名函数:引入static关键字的新用法
【1月更文挑战第15天】C# 9.0为匿名函数带来了一个新的修饰符static,允许开发者明确指定匿名函数不会捕获其包含作用域中的任何变量。这一特性增强了代码的性能和可读性,同时减少了因不小心捕获变量而导致的潜在错误。本文将详细探讨C# 9.0中静态匿名函数的语法、使用场景以及它们如何影响代码的性能和安全性。
|
4月前
|
自然语言处理 JavaScript 前端开发
理解闭包的定义
【7月更文挑战第10天】闭包是编程中的关键概念,特别是函数式编程中。它是函数及其相关引用环境的组合,能访问词法作用域内外的变量,即使外部函数已执行完毕。闭包提供封装私有变量、保持状态、延迟执行的功能,常用于模块化、函数工厂、模拟私有方法和回调。JavaScript中通过函数嵌套实现闭包,但也可能导致内存泄漏和性能问题。
106 2
|
6月前
|
存储 Rust 程序员
rust中的函数:定义、调用与闭包
本文将深入探讨Rust编程语言中函数的定义、调用方式,以及闭包(closures)的概念和应用。我们将从函数的基本语法出发,逐步深入到函数的参数传递、返回值,再进一步介绍闭包及其捕获环境的能力,帮助读者全面理解并熟练运用Rust中的函数与闭包。
|
6月前
|
人工智能 自然语言处理 前端开发
闭包是什么?闭包的用途是什么?
闭包是什么?闭包的用途是什么?
【Groovy】闭包 Closure ( 闭包类 Closure 简介 | this、owner、delegate 成员区别 | 静态闭包变量 | 闭包中定义闭包 )(二)
【Groovy】闭包 Closure ( 闭包类 Closure 简介 | this、owner、delegate 成员区别 | 静态闭包变量 | 闭包中定义闭包 )(二)
161 0
【Groovy】闭包 Closure ( 闭包类 Closure 简介 | this、owner、delegate 成员区别 | 静态闭包变量 | 闭包中定义闭包 )(二)
【Groovy】闭包 Closure ( 闭包类 Closure 简介 | this、owner、delegate 成员赋值及源码分析 )
【Groovy】闭包 Closure ( 闭包类 Closure 简介 | this、owner、delegate 成员赋值及源码分析 )
166 0
【Groovy】闭包 Closure ( 闭包类 Closure 简介 | this、owner、delegate 成员赋值及源码分析 )
【Groovy】闭包 Closure ( 闭包类 Closure 简介 | 闭包 parameterTypes 和 maximumNumberOfParameters 成员用法 )
【Groovy】闭包 Closure ( 闭包类 Closure 简介 | 闭包 parameterTypes 和 maximumNumberOfParameters 成员用法 )
116 0
【Groovy】闭包 Closure ( 闭包类 Closure 简介 | 闭包 parameterTypes 和 maximumNumberOfParameters 成员用法 )
【Groovy】闭包 Closure ( 闭包定义 | 闭包类型 | 查看编译后的字节码文件中的闭包类型变量 )
【Groovy】闭包 Closure ( 闭包定义 | 闭包类型 | 查看编译后的字节码文件中的闭包类型变量 )
148 0
【Groovy】闭包 Closure ( 闭包定义 | 闭包类型 | 查看编译后的字节码文件中的闭包类型变量 )