锁定老帖子 主题:再论闭包
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-06-21
最后修改:2009-06-21
--再论闭包 --
下面这个例子 引自 《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中的对象来实现, 而且更贴近于人的思维。 有必要用对象模拟闭包吗?个人感觉没必要, 用对象模拟的闭包 来实现一种功能,感觉相比上诉两种情况更复杂。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-06-21
对象没错,闭包也没错。
错在滥用。 |
|
返回顶楼 | |
发表时间:2009-06-21
imJavaCoder 写道 对象没错,闭包也没错。
错在滥用。 感觉 用对象模拟闭包 完全没必要, 对象 完全可以用 OO的方式 完成一种功能, 为什么一定要模拟闭包呢? |
|
返回顶楼 | |
发表时间: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); 这种方式跟匿名内部类还是有区别的。 |
|
返回顶楼 | |
发表时间:2009-06-21
Juiz 写道 楼主你接受不了就不要拿出来现了。世界广阔得很,把目光局限在 java 搞不出什么名堂的。
我就事论事, 这是我个人观点, 把目光局限在 java 搞不搞得出名堂我不知道, 但我知道 目光 太分散 更搞不出什么名堂。 |
|
返回顶楼 | |
发表时间: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);
|
|
返回顶楼 | |
发表时间:2009-06-21
Juiz 写道 步行者 写道 imJavaCoder 写道 对象没错,闭包也没错。
错在滥用。 感觉 用对象模拟闭包 完全没必要, 对象 完全可以用 OO的方式 完成一种功能, 为什么一定要模拟闭包呢? 我也可以写几行代码对比一下 C 和汇编,然后说 C 无非比汇编省了几行而已,为什么一定要用 C 呢? 写 10000 行试试看? 没人逼你用啊。 只是不能接受的渐渐的失业或者改行了,或者转变想法接受了。 汇编没人用吗,用汇编的人就失业转行了 ?? 很多操作系统的底层核心还不是用汇编写的。 Java中引入闭包后代码少了 一定 好维护吗?你论证过吗 ? 再说我谈的不是代码多少的问题, 而是java 中 闭包 与 对象 的问题。 |
|
返回顶楼 | |
发表时间:2009-06-21
暂时把楼主归为 倒 闭包派。。
就跟 inter 有 挺穆 跟 倒穆。。 AC milan 有挺安 跟 倒安一样。。 ms现在还可以投票取消闭包。 说实话。 Java 7 可能是对Java社区的一次强大冲击。 不亚于Java 5 。 企业级应用里面为什么爱用Java。 首先面向对象。 开源社区足够强大。 语法足够简单。一些大公司他们连 泛型都不用。 1.4用到死。。就别提Java 7 了。 我始终觉得。 Java老向c#靠拢就走歪了。 盖房子的工人没必要还一身amani。。 |
|
返回顶楼 | |
发表时间:2009-06-21
最后修改:2009-06-21
感觉 JAVA 应该 在OO方向走向简练,
这也是大家喜欢它的理由(我认为), 闭包引进来,函数引进来。。。 感觉会破坏他的纯粹, 不能因为巧克力好吃,就把它拌到米饭里。 |
|
返回顶楼 | |
发表时间:2009-06-21
Saito 写道 暂时把楼主归为 倒 闭包派。。
就跟 inter 有 挺穆 跟 倒穆。。 AC milan 有挺安 跟 倒安一样。。 ms现在还可以投票取消闭包。 说实话。 Java 7 可能是对Java社区的一次强大冲击。 不亚于Java 5 。 企业级应用里面为什么爱用Java。 首先面向对象。 开源社区足够强大。 语法足够简单。一些大公司他们连 泛型都不用。 1.4用到死。。就别提Java 7 了。 我始终觉得。 Java老向c#靠拢就走歪了。 盖房子的工人没必要还一身amani。。 呵呵 请把我归入JAVA倒闭包派 FP 中的 闭包 是不可缺少的 |
|
返回顶楼 | |