锁定老帖子 主题:再论闭包
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-06-23
步行者 写道
whaosoft 写道
其实好多人不知道闭包 我也不是很了解
闭包 是可以包含自由(未绑定)变量 的代码块;这些变量不是在这个代码块或者任何全局上下文中定义的,而是在定义代码块的环境中定义。“闭包” 一词来源于以下两者的结合:要执行的代码块(由于自由变量的存在,相关变量引用没有释放)和为自由变量提供绑定的计算环境(作用域)。 可能上面的定义有点晦涩,下面看一下《Python 核心编程》 对 闭包 的解释。 如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被定义为闭包 。定义在外部函数内的但由内部函数引用或者使用的变量被称为自由变量 。
听了您的解释,还是没听明白,能给个自己总结的简单明了的例子吗?直接用JAVA模拟写个吧。谢谢! |
|
返回顶楼 | |
发表时间:2009-06-23
没看明白啥意思...哈哈
|
|
返回顶楼 | |
发表时间:2009-06-23
没有闭包的java 就是打肿脸充胖子.
|
|
返回顶楼 | |
发表时间:2009-06-23
匿名内部类 传的还是一个对象
|
|
返回顶楼 | |
发表时间:2009-06-23
最后修改:2009-06-23
我也举个例子,照楼主分析的过程和逻辑,AOP和CGLIB字节码增强都类似于闭包,可读性“不佳”,“破坏”OO,难道为了pure的Java楼主也不推荐使用AOP和CGLIB么?
|
|
返回顶楼 | |
发表时间:2009-06-23
treblesoftware 写道
步行者 写道
whaosoft 写道
其实好多人不知道闭包 我也不是很了解
闭包 是可以包含自由(未绑定)变量 的代码块;这些变量不是在这个代码块或者任何全局上下文中定义的,而是在定义代码块的环境中定义。“闭包” 一词来源于以下两者的结合:要执行的代码块(由于自由变量的存在,相关变量引用没有释放)和为自由变量提供绑定的计算环境(作用域)。 可能上面的定义有点晦涩,下面看一下《Python 核心编程》 对 闭包 的解释。 如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被定义为闭包 。定义在外部函数内的但由内部函数引用或者使用的变量被称为自由变量 。
听了您的解释,还是没听明白,能给个自己总结的简单明了的例子吗?直接用JAVA模拟写个吧。谢谢!
http://www.iteye.com/topic/406229 中有一个python闭包的例子,挺简单的,应该可以看懂,
java模拟闭包 主要通过内部类实现, 通过 内部类对象 持有 外部类中定义的变量或属性 来模拟 内部函数 持有 外部函数中定义的变量
下面是一个java 模拟闭包的例子(可能不是很生动)
interface IncrHolder{ public int incr(); } class Counter { public static IncrHolder getIncrHolder(final int startAt){ final int[] count = new int[]{startAt}; return new IncrHolder(){ public int incr(){ return ++ count[0]; } }; } }
运行
IncrHolder h1 = Counter.getIncrHolder(5); System.out.println(h1.incr()); System.out.println(h1.incr());
打印出:
6 7
|
|
返回顶楼 | |
发表时间:2009-06-23
herryhcm 写道 没有闭包的java 就是打肿脸充胖子.
没有闭包的java 可能真的由于大量模拟闭包 打肿脸充胖子。 无论是模拟还是真正引入闭包 变成了 所谓的胖子 这里讨论的是 非要变成这样的胖子吗 变成胖子就比以前好了吗 OOPL 模拟 FP中的闭包 感觉就是打肿脸, 为啥用 OOPL 来模拟 闭包 啊? OOP 来实现啊 |
|
返回顶楼 | |
发表时间:2009-06-24
java从来没有闭包,无名内隐类不是闭包,也许jdk7要加入闭包,闭包与面向对象格格不入,不赞同java中加入闭包,要用闭包去用脚本语言
|
|
返回顶楼 | |
发表时间:2009-06-24
步行者 写道 herryhcm 写道 没有闭包的java 就是打肿脸充胖子.
没有闭包的java 可能真的由于大量模拟闭包 打肿脸充胖子。 无论是模拟还是真正引入闭包 变成了 所谓的胖子 这里讨论的是 非要变成这样的胖子吗 变成胖子就比以前好了吗 OOPL 模拟 FP中的闭包 感觉就是打肿脸, 为啥用 OOPL 来模拟 闭包 啊? OOP 来实现啊 那请教一下,swing中的事件方式,必须要使用内部类的方式,有没有替代方式呢? |
|
返回顶楼 | |
发表时间:2009-06-24
大家都知道世界公认的OO语言的鼻祖,第一种纯OO的语言smalltalk都支持闭包,我不知道那些宣称闭包与OO格格不入的人论据何在?
事实上我发现所有倒闭包派的观点几乎都一样——闭包与OO冲突。不过可笑的是,没有一个人给出论据和论证过程,只有结论。这种话要是说给OO的创始人Alan Kay听,估计他老人家都要笑掉大牙了。 |
|
返回顶楼 | |