论坛首页 Java企业应用论坛

再论闭包

浏览 24773 次
锁定老帖子 主题:再论闭包
该帖已经被评为良好帖
作者 正文
   发表时间:2009-06-21   最后修改:2009-06-21
OO

--再论闭包 --

 

 

下面这个例子 引自 《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中的对象来实现, 而且更贴近于人的思维。

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

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

 

 

   发表时间:2009-06-21  
对象没错,闭包也没错。
错在滥用。
0 请登录后投票
   发表时间:2009-06-21  
imJavaCoder 写道
对象没错,闭包也没错。
错在滥用。


感觉 用对象模拟闭包 完全没必要,
对象 完全可以用 OO的方式 完成一种功能,
为什么一定要模拟闭包呢?
0 请登录后投票
   发表时间:2009-06-21  
public class Closure{
		public void anotherDoSomething(){
				System.out.println("another closure...");
			};
		
		public static void main(String[] anrgs){
				new Closure(){
						protected void innerDoSomething(){
							System.out.println("closure..");
						}
					}.innerDoSomething();
					
				new Closure().anotherDoSomething();	
			}
	}
new ResourceHandler(){
	protected void handle(Resource resource){
		//doSomething ....
		resource.doSomething();
		//doSomething ....
	}
}.handle(request);

 这种方式跟匿名内部类还是有区别的。

0 请登录后投票
   发表时间:2009-06-21  
Juiz 写道
楼主你接受不了就不要拿出来现了。世界广阔得很,把目光局限在 java 搞不出什么名堂的。


我就事论事,
这是我个人观点,
把目光局限在 java 搞不搞得出名堂我不知道,
但我知道 目光 太分散 更搞不出什么名堂。



1 请登录后投票
   发表时间:2009-06-21  
Saito 写道
public class Closure{
		public void anotherDoSomething(){
				System.out.println("another closure...");
			};
		
		public static void main(String[] anrgs){
				new Closure(){
						protected void innerDoSomething(){
							System.out.println("closure..");
						}
					}.innerDoSomething();
					
				new Closure().anotherDoSomething();	
			}
	}
new ResourceHandler(){
	protected void handle(Resource resource){
		//doSomething ....
		resource.doSomething();
		//doSomething ....
	}
}.handle(request);

 这种方式跟匿名内部类还是有区别的。

 

下面的代码确实有匿名内部类,

但匿名内部类不一定就是模拟闭包,

他也可以 提供 一种更简洁的覆盖方式,

不用匿名内部类也可以实现:

 

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

 

0 请登录后投票
   发表时间:2009-06-21  
Juiz 写道
步行者 写道
imJavaCoder 写道
对象没错,闭包也没错。
错在滥用。


感觉 用对象模拟闭包 完全没必要,
对象 完全可以用 OO的方式 完成一种功能,
为什么一定要模拟闭包呢?


我也可以写几行代码对比一下 C 和汇编,然后说 C 无非比汇编省了几行而已,为什么一定要用 C 呢?

写 10000 行试试看?

没人逼你用啊。 只是不能接受的渐渐的失业或者改行了,或者转变想法接受了。


汇编没人用吗,用汇编的人就失业转行了 ??
很多操作系统的底层核心还不是用汇编写的。
Java中引入闭包后代码少了 一定 好维护吗?你论证过吗 ?

再说我谈的不是代码多少的问题,
而是java 中 闭包 与 对象 的问题。


0 请登录后投票
   发表时间:2009-06-21  
  暂时把楼主归为 倒 闭包派。。

  就跟 inter 有 挺穆  跟  倒穆。。

       AC milan 有挺安  跟 倒安一样。。 ms现在还可以投票取消闭包。


  说实话。 Java 7 可能是对Java社区的一次强大冲击。 不亚于Java 5 。 企业级应用里面为什么爱用Java。 首先面向对象。 开源社区足够强大。 语法足够简单。一些大公司他们连 泛型都不用。 1.4用到死。。就别提Java 7 了。

  我始终觉得。 Java老向c#靠拢就走歪了。 盖房子的工人没必要还一身amani。。
3 请登录后投票
   发表时间:2009-06-21   最后修改:2009-06-21
感觉 JAVA 应该 在OO方向走向简练,
这也是大家喜欢它的理由(我认为),
闭包引进来,函数引进来。。。
感觉会破坏他的纯粹,
不能因为巧克力好吃,就把它拌到米饭里。
1 请登录后投票
   发表时间:2009-06-21  
Saito 写道
  暂时把楼主归为 倒 闭包派。。

  就跟 inter 有 挺穆  跟  倒穆。。

       AC milan 有挺安  跟 倒安一样。。 ms现在还可以投票取消闭包。


  说实话。 Java 7 可能是对Java社区的一次强大冲击。 不亚于Java 5 。 企业级应用里面为什么爱用Java。 首先面向对象。 开源社区足够强大。 语法足够简单。一些大公司他们连 泛型都不用。 1.4用到死。。就别提Java 7 了。

  我始终觉得。 Java老向c#靠拢就走歪了。 盖房子的工人没必要还一身amani。。


呵呵 请把我归入JAVA倒闭包派
FP 中的 闭包 是不可缺少的




0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics