什么是闭包?翻译

翻译了一偏比较老的文章,翻译的很勉强。

原文地址:http://javapapers.com/core-java/java-closures/

在这篇文章,我将解释闭包是什么,并说明闭包和内部匿名类的差别,还将介绍java目前闭包的发展。
首先,我要声明以下两点:
1.在jdk1.6中我们没有闭包。
2.在java中内部匿名类不是闭包。
闭包的定义
内嵌的方法类型,我们称为闭包。我来解释下这个定义。一个匿名方法可以获取它周围的变量的快照。
闭包的定义有两部分,一部分是回调,这是一个植入点,可以把函数当作一个参数。另外一部分是回调函数嵌套一些环境信息,就象一个环境的快照。
闭包也常常被认为是一个对象类,它可以获取到闭包范围内的属性。
就象Christopher Strachey在“深入编程语言”中定义的那样,对象类可以保存在一个数据结构中,象参数一样传递,象方法一样返回,能在运行时以独立的身份运行。
数学概念中对闭包的定义是,当你操作一个set中的成员时,结果仍然是set中的成员时,这就是闭包。
匿名内部类不是闭包
java中的匿名类和闭包非常相像。匿名类不100%满足闭包的定义,但是非常接近,这也是为什么我们常常看到有文章把内部匿名类称为闭包。
为什么我说不是100%?匿名内部类职能获取被声明为final的局部变量。因为这个限制,java中的内部匿名类不是闭包。
如果你记得《memory menagement in java》这个文章,你可能记得局部变量是保存在栈中的。
这些栈在方法调用时创建,在方法返回时销毁。不同于局部变量,final类型的变量当方法返回后,也是保存的。
如果我们想把一个匿名类转化成闭包,我们应该允许它访问它周围的变量。但是根据目前的内存管理策略,当方法返回后,这些变量就不能再获得了。
java中的闭包
那么,我们将来会如何在java中实现闭包呢?Peter Ahe, James Gosling, Neal Gafter and Gilad Bracha写了一份关于闭包的说明。
它详细说明了如何在java中实现闭包,并用示例代码演示了如何使用闭包。
我们有一个实现闭包的JSR335,它名叫java中的lambda表达式。

猜你喜欢

转载自mushme.iteye.com/blog/2310990