public void run()
{
parseData();
}
};
方法 parseData 确实 封闭(因而有了名字 “闭包”)在 Runnable 对象的实例 worker 中。它可以像数据一样在方法之间传递,并可以在任何时间通过发送消息(称为 run ) 给 worker 对象而执行。
更多的例子
另一个在面向对象世界中使用闭包和高阶函数的例子是 Visitor 模式。如果还不熟悉这种模式,请参阅 参考资料以了解更多有关它的内容。基本上,Visitor 模式展现一个称为 Visitor 的参与者,该参与者的实例由一个复合对象(或者数据结构)接收,并应用到这个数据结构的每一个构成节点。Visitor 对象实质上 封闭 了处理节点/元素的逻辑,使用数据结构的 accept (visitor) 方法作为应用逻辑的高阶函数。
通过使用适当不同的 Visitor 对象(即闭包),可以对数据结构的元素应用完全不同的处理逻辑。与此类似,可以向不同的高阶函数传递同样的闭包,以用另一种方法处理数据结构(例如,这个新的高阶函数可以实现不同逻辑,用于遍历所有构成元素)。
类 java.utils.Collections 提供了另一个例子,这个类在版本 1.2 以后成为了 Java 2 SDK 的一部分。它提供的一种实用程序方法是对在 java.util.List 中包含的元素排序。不过,它使调用者可以将排序列表元素的逻辑封装到一个类型为 java.util.Comparator 的对象中,其中 Comparator 对象作为第二个参数传递给排序方法。
创建闭包
广意地说,有两种生成闭包的技术,使用闭包的代码可以等效地使用这两种技术。创建闭包后,可以以统一的方式传递它,也可以向它发送消息以让它执行其封装的逻辑。因此,技术的选择是偏好的问题,在某些情况下也与环境有关。