今天在javaeye论坛里看到的帖子,认真地从头看到尾,对闭包有了进一步的认识。感谢原帖楼主和所有回帖的朋友。
原帖地址:
http://www.javaeye.com/topic/412451
主题:再论闭包
作者:步行者
对闭包感兴趣的朋友可以移步去看看。
首先,给出闭包的定义(定义说法比较多,本人偷懒,就直接从原帖里摘取了。):
闭包 是可以包含自由(未绑定)变量 的代码块;这些变量不是在这个代码块或者任何全局上下文中定义的,而是在定义代码块的环境中定义。“闭包” 一词来源于以下两者的结合:要执行的代码块(由于自由变量的存在,相关变量引用没有释放)和为自由变量提供绑定的计算环境(作用域)。
可能上面的定义有点晦涩,下面看一下《Python 核心编程》 对 闭包 的解释。
如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被定义为闭包 。定义在外部函数内的但由内部函数引用或者使用的变量被称为自由变量 。
原帖中“liusong1111”回帖值得思考:
[closure作为一等公民,可以被一个普通的变量引用、传递。在ruby里意味着它是Proc的一个对象(实例),自然可以调用Proc的方法(比如
call)。以java的视角,类是用来组织数据的,不是描述行为。而对于ruby,行为也是数据,也可以用类描述,类也是对象,类的类还是对象,这才是
真正的Everything is
Object。楼主受java和java所谓的OO的影响太深,评判这些问题时,应该眼光往外多看看,避免思维定势。尤其应该深入学习一门带闭包的语言,
看看它到底是怎么用的。]
首先,我同意可以用OO模拟闭包的观点,这已经由原帖作者“步行者”给出详细的例子了。但是这势必在一定程度上会增加代码的复杂度和臃肿度。我想,大部分时候大家更希望用更简洁的方法去完成同样的功能吧。
另外,对于闭包会破坏OO的结构的争论,我更愿意从广义的角度来理解OO的定义。正如上面引用中所说,“
以java的视角,类是用来组织数据的,不是描述行为。而对于ruby,行为也是数据,也可以用类描述,类也是对象,类的类还是对象”。如果采用闭包,那么这个内部函数中可以定义局部变量,同时它本身就是行为,此时具有属性和行为的闭包,何尝不可以看做是OO的呢?
个人的观点是如果能达到以下两条,那么我支持Java中引入闭包:
1)引入闭包能够在保证程序的可读性的基础上,简化程序编写的复杂度,降低代码的臃肿度。
2)引入闭包至少能够保证在大部分情况下,程序的性能能够保持或者得到提升。(这里排除了极限情况)
本人对闭包的了解还远远不够,计划有空闲的时候,认真地学习下闭包的知识和相关的应用。
欢迎讨论。