`
步行者
  • 浏览: 167741 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

再论闭包

    博客分类:
  • JAVA
阅读更多

--再论闭包 --

 

 

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

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

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

 

 

分享到:
评论
24 楼 visitor 2009-06-22  
无可奈何 写道
闭包就是函数对象,何必整的那么复杂的概念?


闭包 支持 重载,覆盖,继承吗?
混淆概念啊。。
23 楼 步行者 2009-06-22  
无可奈何 写道
闭包就是函数对象,何必整的那么复杂的概念?

闭包是函数,不是对象。。
不过他俩之间有一些 相似点
闭包 和 对象都有内部状态
对象的内部状态是 属性
闭包的内部状态是 外部函数定义的变量
22 楼 jamesqiu 2009-06-22  
现在java使用接口或者说类, 是可以实现closure的功能;

java7实现closure, 很多社区的人是不希望java语义变得复杂模糊, 但如果成熟了引入进来应该没有问题, 想用的就用, 不想用可以不用;
还有很多大企业和开源产品还没有使用jdk1.5+的原因, 可能是在目标OS上还没有稳定成熟的高版本jdk. 比如jdk1.5,1.6在osx和aix,hp,bsd上出现远远滞后于win和linux,solaris. 如果你的产品希望运行在所有这些平台上, 就不会马上使用jdk中的新特性.
21 楼 无可奈何 2009-06-21  
闭包就是函数对象,何必整的那么复杂的概念?
20 楼 步行者 2009-06-21  
回复上贴:
   用好这支笔首先也要了解这支笔,这支笔的优点和缺点
   一只马尾毛笔,加上几缕羊毛,就很难写出好字了。。

   我在该贴要表达的意思是:
"一种功能如果可以用FP中的闭包来实现,
那它必然也可以用OO中的对象来实现, 而且更贴近于人的思维。
有必要用对象模拟闭包吗?个人感觉没必要,
用对象模拟的闭包 来实现一种功能,感觉相比上诉两种情况更复杂。”
19 楼 chandler 2009-06-21  
步行者 写道
chandler 写道
    有什么不同呢?两者都是属于代码风格的范畴了。
    我个人觉得匿名类是个很垃圾的东西。但是还有很多比我水平高很多的人很喜欢用。除非你能找出一个一定要用闭包,不用闭包就解决不了的常见问题。我觉得讨论孰优孰劣还有意义。不然,就好像你吃饭,上哪家馆子是你的自由,不见得不和你上一家馆子的人就不懂美食了?
    其实我觉得支持闭包,和不喜欢闭包的人有一大的区别。就是风格不一样。估计你是那种希望代码行数越少越好的。而我呢,情愿多写几行代码,为的就是看的清楚一点。只要性能不影响。两者又有什么问题呢?
     


代码风格 。。
闭包的问题 是 会不会 破坏JAVA 面向对象特性的问题
代码风格太宽泛了。。

   肯定会破坏。这用得着讨论么?
   其实像匿名类,和静态方法也可以算是破坏了。
   怎么说呢,如果说想知道闭包有没有必要加入到java里面。我觉得是可有可无。毕竟OO是关键看的是使用的人。而不是语言。你用java也完全可以写成完完全全的面向过程的程序。或者说不伦不类的面向对象的程序……
   你太专注于语言,而不明白,其实任何语言只是我们手中的一支笔而已。
18 楼 步行者 2009-06-21  
chandler 写道
    有什么不同呢?两者都是属于代码风格的范畴了。
    我个人觉得匿名类是个很垃圾的东西。但是还有很多比我水平高很多的人很喜欢用。除非你能找出一个一定要用闭包,不用闭包就解决不了的常见问题。我觉得讨论孰优孰劣还有意义。不然,就好像你吃饭,上哪家馆子是你的自由,不见得不和你上一家馆子的人就不懂美食了?
    其实我觉得支持闭包,和不喜欢闭包的人有一大的区别。就是风格不一样。估计你是那种希望代码行数越少越好的。而我呢,情愿多写几行代码,为的就是看的清楚一点。只要性能不影响。两者又有什么问题呢?
     


代码风格 。。
闭包的问题 是 会不会 破坏JAVA 面向对象特性的问题
代码风格太宽泛了。。
17 楼 303535576 2009-06-21  
chandler 写道
    有什么不同呢?两者都是属于代码风格的范畴了。
    我个人觉得匿名类是个很垃圾的东西。但是还有很多比我水平高很多的人很喜欢用。除非你能找出一个一定要用闭包,不用闭包就解决不了的常见问题。我觉得讨论孰优孰劣还有意义。不然,就好像你吃饭,上哪家馆子是你的自由,不见得不和你上一家馆子的人就不懂美食了?
    其实我觉得支持闭包,和不喜欢闭包的人有一大的区别。就是风格不一样。估计你是那种希望代码行数越少越好的。而我呢,情愿多写几行代码,为的就是看的清楚一点。只要性能不影响。两者又有什么问题呢?
     



好的代码风格是很重要的。。
16 楼 chandler 2009-06-21  
    有什么不同呢?两者都是属于代码风格的范畴了。
    我个人觉得匿名类是个很垃圾的东西。但是还有很多比我水平高很多的人很喜欢用。除非你能找出一个一定要用闭包,不用闭包就解决不了的常见问题。我觉得讨论孰优孰劣还有意义。不然,就好像你吃饭,上哪家馆子是你的自由,不见得不和你上一家馆子的人就不懂美食了?
    其实我觉得支持闭包,和不喜欢闭包的人有一大的区别。就是风格不一样。估计你是那种希望代码行数越少越好的。而我呢,情愿多写几行代码,为的就是看的清楚一点。只要性能不影响。两者又有什么问题呢?
     
15 楼 ninini 2009-06-21  
闭包 不在 面向对象开发方法 的范畴里,
但可以在一个语言的范畴里,
像 python 就同时支持 闭包和对象。
14 楼 步行者 2009-06-21  
内部类也是类,是对象的抽象。
可闭包 就不在OO范畴里了。
13 楼 chandler 2009-06-21  
      我觉得,闭包这个东西就属于习惯范畴,而不是语言范畴。就好像java中的匿名类,我就不喜欢用。
12 楼 步行者 2009-06-21  
<div class="quote_title">whaosoft 写道</div>
<div class="quote_div">其实好多人不知道闭包 我也不是很了解</div>
<p> </p>
<p><span style="">
<p style="padding: 0px; margin: 0px;"><strong style="font-weight: bold;"><span style="color: #0000ff;">  闭包</span> <span style="color: #ff0000;"> </span> </strong>是可以包含<span style="color: #0000ff;">自由(未绑定)变量</span> 的代码块;这些变量不是在这个代码块或者任何全局上下文中定义的,而是在定义代码块的环境中定义。“闭包” 一词来源于以下两者的结合:要执行的代码块(由于自由变量的存在,相关变量引用没有释放)和为自由变量提供绑定的计算环境(作用域)。</p>
<p style="padding: 0px; margin: 0px;">    可能上面的定义有点晦涩,下面看一下<span style="color: #0000ff;">《Python 核心编程》</span> 对 <strong style="font-weight: bold;"><span style="color: #0000ff;">闭包 <span style="font-weight: normal;"><span style="color: #000000;">的解释。</span></span></span></strong></p>
<p style="padding: 0px; margin: 0px;"><strong style="font-weight: bold;"><span><span style="font-weight: normal;">    如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被定义为<strong style="font-weight: bold;"><span style="color: #0000ff;">闭包</span> </strong>。定义在外部函数内的但由内部函数引用或者使用的变量被称为<span style="color: #0000ff;">自由变量</span> 。</span></span></strong></p>
<p style="padding: 0px; margin: 0px;"><strong style="font-weight: bold;"></strong></p>
<p style="padding: 0px; margin: 0px;"><strong style="font-weight: bold;"></strong></p>
<p style="padding: 0px; margin: 0px;"><strong style="font-weight: bold;"><span></span></strong></p>
<p style="padding: 0px; margin: 0px;"> </p>
</span></p>
11 楼 whaosoft 2009-06-21  
其实好多人不知道闭包 我也不是很了解
10 楼 步行者 2009-06-21  
visitor 写道
感觉 JAVA 应该 在OO方向走向简练,
这也是大家喜欢它的理由(我认为),
闭包引进来,函数引进来。。。
感觉会破坏他的纯粹,
不能因为巧克力好吃,就把它拌到米饭里。


支持
9 楼 步行者 2009-06-21  
Saito 写道
  暂时把楼主归为 倒 闭包派。。

  就跟 inter 有 挺穆  跟  倒穆。。

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


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

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


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




8 楼 visitor 2009-06-21  
感觉 JAVA 应该 在OO方向走向简练,
这也是大家喜欢它的理由(我认为),
闭包引进来,函数引进来。。。
感觉会破坏他的纯粹,
不能因为巧克力好吃,就把它拌到米饭里。
7 楼 Saito 2009-06-21  
  暂时把楼主归为 倒 闭包派。。

  就跟 inter 有 挺穆  跟  倒穆。。

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


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

  我始终觉得。 Java老向c#靠拢就走歪了。 盖房子的工人没必要还一身amani。。
6 楼 步行者 2009-06-21  
Juiz 写道
步行者 写道
imJavaCoder 写道
对象没错,闭包也没错。
错在滥用。


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


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

写 10000 行试试看?

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


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

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


5 楼 步行者 2009-06-21  
<div class="quote_title">Saito 写道</div>
<div class="quote_div">
<div class="quote_div">
<div class="dp-highlighter">
<pre name="code" class="java">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();
}
}</pre>
</div>
</div>
<pre name="code" class="java">new ResourceHandler(){
protected void handle(Resource resource){
//doSomething ....
resource.doSomething();
//doSomething ....
}
}.handle(request);
</pre>
<p> 这种方式跟匿名内部类还是有区别的。</p>
</div>
<p> </p>
<p>下面的代码确实有匿名内部类,</p>
<p>但匿名内部类不一定就是模拟闭包,</p>
<p>他也可以 提供 一种更简洁的覆盖方式,</p>
<p>不用匿名内部类也可以实现:</p>
<p> </p>
<pre name="code" class="java">class ConcreteResourceHandler extends ResourceHandler{
protected void handle(Resource resource){
//doSomething ....
resource.doSomething();
//doSomething ....
}
}
......
new ConcreteResourceHandler().handle(request);</pre>
 
<p> </p>

相关推荐

    论文研究-基于网络闭包理论的交易型社区网络演化研究.pdf

    论文研究-基于网络闭包理论的交易型社区网络演化研究.pdf, 随着社会化商务时代的到来,交易型社区的发展越来越成为解决社会化商务中经济性与社会性矛盾的关键.但交易型...

    论文研究-闭包算子空间范畴及其性质研究.pdf

    基于对闭包运算的性质研究,引入了闭包算子空间及其之间的连续映射概念,证明了闭包算子空间(对象)及其之间的连续映射(态射)构成范畴(闭包算子范畴)。证明了闭包算子空间范畴中(有限)积和(有限)余积的存在...

    原子闭包系统, 原子闭包算子和原子全蕴含系统

    原子闭包系统, 原子闭包算子和原子全蕴含系统,杨海建,李庆国,本文引进了原子闭包系统,原子闭包算子以及原子全蕴含系统等概念, 研究了它们之间的相互关系, 给出了由原子闭包系统来表示有限原子�

    论文研究-完备剩余格上的蕴涵闭包算子.pdf

    利用蕴涵运算,在完备剩余格上定义了蕴涵闭包算子,给出了它的若干等价刻画及其表示定理。

    三次扩张的整闭包

    三次扩张的整闭包,龚成,,计算有限扩张的整闭包不但是交换代数中的一个核心问题,也很受代数几何以及代数数论发展的推动。 本文在前人研究的基础上,去掉2

    论文研究-求解最小闭包球问题改进的SMO-型算法.pdf

    研究[n]维空间中[m]个点的最小闭包球(MEB)问题。通过结合确定并删除内部点的技术到序列最小最优化(SMO)方法中,提出一种近似求解MEB问题的改进的SMO-型算法。证明了该算法具有线性收敛性。数值结果表明对于一些...

    论文研究-基于闭包的聚类判别方法研究.pdf

    区别于传统的聚类方法,提出了以类为起点,通过构造闭包进行聚类的新方法,并建立了聚类判别模型,此模型给出了对于闭包间的交叉区域的检验点的判别准则。然后针对二维的聚类问题,提出了以最小圆为闭包的聚类判别...

    论文研究-完备剩余格上的蕴涵闭包系统.pdf

    在完备剩余格上引入了蕴涵闭包系统的概念,讨论了蕴涵闭包系统与闭包系统之间的关系。给出了蕴涵闭包系统的一些性质及其表示定理。进一步研究了蕴涵闭包算子和蕴涵闭包系统的关系。

    论文研究-闭包算子与邻域系的广义化.pdf

    通过弱化一般拓扑中的闭包算子公理,引入了广义闭包算子的概念,研究了其与稍早引入的广义邻域系的关系。特别的,证明了二者之间存在着自然的完备格同构。

    论文研究-大数据环境下最小单调约束闭包Hadoop并行关联规则 .pdf

    大数据环境下最小单调约束闭包Hadoop并行关联规则,李春青,李海生,针对传统关联规则算法存在较大规则冗余问题,提出基于最小单调约束闭包Hadoop并行化关联规则。首先,基于闭包算子约束规则等价关系

    论文研究-基于卡诺图确定所有候选码和属性集闭包 .pdf

    基于卡诺图确定所有候选码和属性集闭包,张亦舜,,关系模式设计过程中,确定所有候选码及任意属性集的闭包是最基本的计算。本文证明此两问题等价于函数依赖图中质蕴含的确定和判断

    关于凸分析中代数闭包和向量闭包的概念研究 (2013年)

    研究了线性空间中代数闭包和向量闭包的关系,给出了凸集的代数闭包是凸集的新证明,利用代数闭包与向量闭包的关系,得到了一个涉及向量闭包的分离定理。

    基于三元闭包和会员闭包的社区发现算法研究 (2014年)

    随着网络的发展和人们沟通方式的扩展,社交网络影响了人们的生活,改变了人们传播与分享消息的方式,吸引了越来越多的人关注和研究社交网络。社交网络即社交网络服务,源自英文 SNS(social network service)的翻译,...

    代数交半格和代数并半格的闭包系统表示

    代数交半格和代数并半格的闭包系统表示,吴明渊,李庆国,Domain理论中,各类格序结构的集合表示是一个重要研究课题。一个众所周知的结论是代数闭包系统能表示代数格。本文研究代数闭包系统�

    论文研究-直觉模糊关系再研究.pdf

    对直觉模糊关系进行了再研究, 提出了直觉模糊关系的核与闭包的概念,得到了直觉模糊关系的十四集定理. 首先,利用直觉模糊逆自反关系、对称关系以及自反关系给出了直觉模糊...

    ch8-关系的闭包和等价关系-集合论1

    3. 设 R’ 集合A 上的自反关系,且R⊆R’, 则对 1. 输入MR 2. 计数器 k 置初值n-1

    On Computing the Transitive Closure of a Relation PDF

    On Computing the Transitive Closure of a Relation 计算二元关系的(自反)传递闭包 编译器设计,有名的论文

    求解最小体积闭包椭球问题的积极集算法 (2015年)

    先建立求解最小体积闭包椭球(MVEE)问题秩-2 更新算法的线性收敛性,然后给出一种简单的积极集策略,每次迭代计算距离当前椭球最远的N个点.结合该策略到秩-2 更新算法中,得到一个求解MVEE问题的积极集算法.数值结果表明...

    机器学习论文

    训练需花费大量时间和空间的问题,提出了基于中心约束最小闭包球的加权多类算法。该算 法首先利用先验知识确定一种新的基于相对紧密度的方法计算样本权值并将其融合到支持向 量机中,然后转化为中心约束的最小闭包球...

Global site tag (gtag.js) - Google Analytics