再论闭包

--再论闭包 --

 

 

下面这个例子 引自 《Groovy in action》 第五章。

 

一段 Java 代码,

interface ResourceUser {
    void use(Resource resource)
}
resourceHandler.handle(new ResourceUser(){
    public void use (Resource resource) {
        resource.doSomething()
    }
});

 

下面是一段等价 Groovy 的代码。

resourceHandler.handle { resource -> resource.doSomething() }

 

惊叹吧 ?  8行JAVA代码居然被 Groovy 如此 easy 地实现了。

惊叹! 惊叹之余再来反思。。。

 

(1),为何能如此简单(Groovy):因为它在使用闭包。

        Groovy中 行为元素(函数,过程)作为一级元素。

        像resource -> resource.doSomething() 就是一个匿名函数。

        参数 为 resource,返回值 为 resource.doSomething()。

 

(2),为何如此复杂(Java):因为它在模拟闭包。

        函数咱没有,那就包装一下,模拟一下,但好像臃肿了点。。

 

(3),易理解吗?

       Groovy 资源处理器 (名词:resourceHandler)处理 (动词:handle)一个函数 (匿名函数:resource ->  

                      resource.doSomething())。

       模拟闭包的Java 资源处理器 (名词:resourceHandler)处理 (动词:handle)一个资源用户 (名词:new

                      ResourceUser(){...})。

       资源处理器应该只处理资源啊。。。

 

(4), 重新造句 (Java)

       OO的Java 资源处理器 (名词:resourceHandler)处理 (动词:handle)一个资源 (名词:resource)。

 

new ResourceHandler(){
	protected void handle(Resource resource){
		//doSomething ....
		resource.doSomething();
		//doSomething ....
	}
}.handle(request);

 

 

个人观点

 

一种功能如果可以用FP中的闭包来实现,

那它必然也可以用OO中的对象来实现, 而且更贴近于人的思维。

有必要用对象模拟闭包吗?个人感觉没必要,

用对象模拟的闭包 来实现一种功能,感觉相比上诉两种情况更复杂。

 

 

你可能感兴趣的:(OO,Ruby,groovy,lisp,FP)