`
步行者
  • 浏览: 169825 次
  • 性别: 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中的对象来实现, 而且更贴近于人的思维。

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

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

 

 

分享到:
评论
44 楼 步行者 2009-06-24  
幸存者 写道
步行者 写道
闭包是对象吗,它有属性和方法吗?

闭包为什么不能是对象?它为什么不能有属性和方法?

以C#为例:
class Program {
    static void Main(string[] args) {
        ShowClosure(a => a + 1);
    }

    static void ShowClosure(Func<int, int> f) {
        Console.WriteLine(f.Method);
        Console.WriteLine(f.ToString());
    }
}


闭包是一个有状态的函数,是FP中的概念
我不熟悉 c#,
但看得出来 f 是一个对象,
如果a => a + 1是一个闭包
那 f 算是一个封装了闭包的对象
已不是单纯的闭包



43 楼 幸存者 2009-06-24  
步行者 写道
闭包是对象吗,它有属性和方法吗?

闭包为什么不能是对象?它为什么不能有属性和方法?

以C#为例:
class Program {
    static void Main(string[] args) {
        ShowClosure(a => a + 1);
    }

    static void ShowClosure(Func<int, int> f) {
        Console.WriteLine(f.Method);
        Console.WriteLine(f.ToString());
    }
}
42 楼 步行者 2009-06-24  
幸存者 写道
维基百科 写道
面向对象程序设计(英语:Object-oriented programming,缩写:OOP),指一种程序设计范型,同时也是一种程序开发的方法论。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。


麻烦你指出这句话中哪几个字或词说明了闭包与OO的冲突。

步行者 写道
Alan Kay估计早都听到这种言论了,好像没听说他的牙已经离开他的牙床了
不要把你的感觉 附加到别人身上

看来你连小学语文修辞手法都没学好,如何能学好编程语言呢?




闭包是对象吗,它有属性和方法吗?

你不会以为 我真的认为你的牙被笑掉了吧。。
那你得测测智商了
41 楼 幸存者 2009-06-24  
维基百科 写道
面向对象程序设计(英语:Object-oriented programming,缩写:OOP),指一种程序设计范型,同时也是一种程序开发的方法论。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。


麻烦你指出这句话中哪几个字或词说明了闭包与OO的冲突。

步行者 写道
Alan Kay估计早都听到这种言论了,好像没听说他的牙已经离开他的牙床了
不要把你的感觉 附加到别人身上

看来你连小学语文修辞手法都没学好,如何能学好编程语言呢?


40 楼 步行者 2009-06-24  
幸存者 写道
大家都知道世界公认的OO语言的鼻祖,第一种纯OO的语言smalltalk都支持闭包,我不知道那些宣称闭包与OO格格不入的人论据何在?
事实上我发现所有倒闭包派的观点几乎都一样——闭包与OO冲突。不过可笑的是,没有一个人给出论据和论证过程,只有结论。这种话要是说给OO的创始人Alan Kay听,估计他老人家都要笑掉大牙了。


“闭包与OO格格不入的人论据何在”
请你看看OO的基本概念

Alan Kay估计早都听到这种言论了,好像没听说他的牙已经离开他的牙床了
不要把你的感觉 附加到别人身上
39 楼 幸存者 2009-06-24  
大家都知道世界公认的OO语言的鼻祖,第一种纯OO的语言smalltalk都支持闭包,我不知道那些宣称闭包与OO格格不入的人论据何在?
事实上我发现所有倒闭包派的观点几乎都一样——闭包与OO冲突。不过可笑的是,没有一个人给出论据和论证过程,只有结论。这种话要是说给OO的创始人Alan Kay听,估计他老人家都要笑掉大牙了。
38 楼 icewubin 2009-06-24  
步行者 写道
herryhcm 写道
没有闭包的java 就是打肿脸充胖子.


没有闭包的java 可能真的由于大量模拟闭包 打肿脸充胖子。
无论是模拟还是真正引入闭包 变成了 所谓的胖子
这里讨论的是 非要变成这样的胖子吗
变成胖子就比以前好了吗

OOPL 模拟 FP中的闭包 感觉就是打肿脸,
为啥用 OOPL 来模拟 闭包 啊?
OOP 来实现啊

那请教一下,swing中的事件方式,必须要使用内部类的方式,有没有替代方式呢?
37 楼 unsid 2009-06-24  
java从来没有闭包,无名内隐类不是闭包,也许jdk7要加入闭包,闭包与面向对象格格不入,不赞同java中加入闭包,要用闭包去用脚本语言
36 楼 步行者 2009-06-23  
herryhcm 写道
没有闭包的java 就是打肿脸充胖子.


没有闭包的java 可能真的由于大量模拟闭包 打肿脸充胖子。
无论是模拟还是真正引入闭包 变成了 所谓的胖子
这里讨论的是 非要变成这样的胖子吗
变成胖子就比以前好了吗

OOPL 模拟 FP中的闭包 感觉就是打肿脸,
为啥用 OOPL 来模拟 闭包 啊?
OOP 来实现啊
35 楼 步行者 2009-06-23  
<div class="quote_title">treblesoftware 写道</div>
<div class="quote_div">
<div class="quote_title">步行者 写道</div>
<div class="quote_div">
<div class="quote_title">whaosoft 写道</div>
<div class="quote_div">其实好多人不知道闭包 我也不是很了解</div>
<p> </p>
<p><span>
</span></p>
<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;"></strong></p>
<p style="padding: 0px; margin: 0px;"> </p>
<p> </p>
</div>
<p> </p>
<p>听了您的解释,还是没听明白,能给个自己总结的简单明了的例子吗?直接用JAVA模拟写个吧。<img src="/images/smiles/icon_biggrin.gif" alt="">谢谢!</p>
</div>
<p> </p>
<p><span style=""><a href="/topic/406229">http://www.iteye.com/topic/406229</a> 中有一个python闭包的例子,挺简单的,应该可以看懂,</span></p>
<p> </p>
<p>java模拟闭包 主要通过内部类实现,</p>
<p>通过 内部类对象 持有 外部类中定义的变量或属性</p>
<p>来模拟 内部函数 持有 外部函数中定义的变量</p>
<p> </p>
<p>下面是一个java 模拟闭包的例子(可能不是很生动)</p>
<p> </p>
<p> </p>
<pre name="code" class="java">interface IncrHolder{
public int incr();
}
class Counter { 
    public static IncrHolder getIncrHolder(final int startAt){
    final int[] count = new int[]{startAt};
    return new IncrHolder(){
public int incr(){
return ++ count[0];
}
    };
    }
}  </pre>
<p> </p>
<p> </p>
<p>运行</p>
<p> </p>
<p> </p>
<pre name="code" class="java">IncrHolder h1 = Counter.getIncrHolder(5);
System.out.println(h1.incr());
System.out.println(h1.incr());</pre>
<p> </p>
<p> </p>
<p>打印出:</p>
<p> </p>
<p>     6</p>
<p>     7</p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
34 楼 icewubin 2009-06-23  
我也举个例子,照楼主分析的过程和逻辑,AOP和CGLIB字节码增强都类似于闭包,可读性“不佳”,“破坏”OO,难道为了pure的Java楼主也不推荐使用AOP和CGLIB么?
33 楼 madbluesky 2009-06-23  
匿名内部类 传的还是一个对象
32 楼 herryhcm 2009-06-23  
没有闭包的java 就是打肿脸充胖子.
31 楼 kenees 2009-06-23  
没看明白啥意思...哈哈
30 楼 treblesoftware 2009-06-23  
<div class="quote_title">步行者 写道</div>
<div class="quote_div">
<div class="quote_title">whaosoft 写道</div>
<div class="quote_div">其实好多人不知道闭包 我也不是很了解</div>
<p> </p>
<p><span>
</span></p>
<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;"></strong></p>
<p style="padding: 0px; margin: 0px;"> </p>
<p> </p>
</div>
<p> </p>
<p>听了您的解释,还是没听明白,能给个自己总结的简单明了的例子吗?直接用JAVA模拟写个吧。<img src="/images/smiles/icon_biggrin.gif" alt="">谢谢!</p>
29 楼 步行者 2009-06-23  
对象是状态和行为的封装
闭包是封装状态的行为

不要在这个“闭包是不是对象”的问题上拍砖了

28 楼 icefishc 2009-06-23  
visitor 写道
幸存者 写道
visitor 写道
无可奈何 写道
闭包就是函数对象,何必整的那么复杂的概念?


闭包 支持 重载,覆盖,继承吗?
混淆概念啊。。

对象支持重载,覆盖,继承吗?
到底是谁混淆概念?


闭包 可以作为 OO 中的对象吗?
OO 不支持重载,覆盖,继承特性吗?
到底是谁混淆概念?问问自己


类 对象
这样友好多了
纯水。。。。。。。
27 楼 visitor 2009-06-23  
幸存者 写道
visitor 写道
无可奈何 写道
闭包就是函数对象,何必整的那么复杂的概念?


闭包 支持 重载,覆盖,继承吗?
混淆概念啊。。

对象支持重载,覆盖,继承吗?
到底是谁混淆概念?


闭包 可以作为 OO 中的对象吗?
OO 不支持重载,覆盖,继承特性吗?
到底是谁混淆概念?问问自己
26 楼 iaimstar 2009-06-23  
幸存者 写道
visitor 写道
无可奈何 写道
闭包就是函数对象,何必整的那么复杂的概念?


闭包 支持 重载,覆盖,继承吗?
混淆概念啊。。

对象支持重载,覆盖,继承吗?
到底是谁混淆概念?

对于这里我很有兴趣。。继续丫
25 楼 幸存者 2009-06-23  
visitor 写道
无可奈何 写道
闭包就是函数对象,何必整的那么复杂的概念?


闭包 支持 重载,覆盖,继承吗?
混淆概念啊。。

对象支持重载,覆盖,继承吗?
到底是谁混淆概念?

相关推荐

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

    综上所述,文章中的内容涉及到抽象代数、格论、范畴论等多个数学领域的知识,对于理解有限集合上的闭包系统、闭包算子以及有限原子格的表示提供了深刻的见解。这些概念在数学理论研究以及逻辑电路设计等领域有着广泛...

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

    本文研究的目的是在完备剩余格上利用蕴涵运算定义蕴涵闭包算子,并给出其等价刻画和表示定理。 首先,让我们探讨闭包算子(Closure Operators)的基础知识。闭包算子是在偏序集中定义的一个映射,它满足增值性、保...

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

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

    离散数学的各种闭包运算

    闭包运算作为离散数学中的核心概念,广泛应用于图论、集合论、逻辑学等多个领域。在此,我们将深入探讨闭包运算的类型,以及如何通过算法实现它们。 1. **闭包运算**:闭包运算是一种在集合上定义的操作,它将一个...

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

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

    Gunther Jger拓扑空间中的闭包算子和内部算子的研究

    在经典集合论中,闭包指的是包含给定集合的所有闭集的交集,而内部则是由包含于给定集合的所有开集的并集构成。在模糊逻辑和模糊集的背景下,这些概念需要扩展以适应连续性和隶属度的模糊特性。 在韩元良的研究中,...

    传递闭包实现

    传递闭包(Transitive Closure)是集合论中的一个概念,指的是在集合\(X\)上的一类特殊的二元关系。具体来说,如果在集合\(X\)上有一个二元关系\(R\),那么\(R\)的传递闭包是指包含\(R\)的、\(X\)上最小的传递关系。...

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

    在一般拓扑学中,拓扑结构可以通过一系列基本概念来刻画,如邻域、内部、闭包以及滤子(网)的收敛等。这些概念的经典定义依赖于特定的公理系统,例如闭包算子的定义通常依赖于下面的公理:(C1)对于任意子集A和B,...

    离散数学编程之用C++编写的求对称闭包程序

    对称闭包是离散数学中的一个重要概念,它在图论、集合论和关系理论中有广泛的应用。本文将深入探讨对称闭包的概念,并通过C++编程实现来帮助理解。 对称闭包指的是一个关系R在其自身的对称操作下所形成的最小关系,...

    离散数学编程之用C++编写的求自反闭包程序

    自反闭包是图论和集合论中的一个概念,它在关系理论中尤其重要。本话题聚焦于如何使用C++编程语言来实现求解自反闭包的程序。 首先,我们来理解自反闭包的概念。在集合论中,一个关系R定义在集合A上,如果对于集合A...

    关系性质判断及闭包的求法

    在离散数学中,二元关系是集合论和图论中的基本概念,它描述了集合内的元素如何相互关联。本主题主要关注如何判断一个关系的性质以及如何计算其闭包。我们将深入探讨自反性、对称性和传递性的概念,并学习如何通过...

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

    在完备剩余格上引入蕴涵闭包系统的概念,是将逻辑学中的蕴涵关系与抽象代数的闭包系统概念相结合的尝试。为了深入理解这些概念及其性质,我们首先要回顾一些基本定义。 首先,闭包系统是完备格理论中的一个基本概念...

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

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

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

    在计算机科学中,集合论和离散数学是基础理论,其中关系的闭包和等价关系是重要概念。本文将详细阐述这些概念及其应用。 首先,我们关注“关系的闭包”。关系闭包是指在给定集合A上的一个关系R,通过某种运算扩展R...

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

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

    离散数学-关系的闭包.ppt

    其中,关系的闭包是一个核心概念,它涉及到集合论、二元关系和函数等多个领域。 首先,我们要理解集合论的基本概念。集合是由特定对象组成的整体,可以进行并集、交集、差集等基本运算。在有穷集合中,我们还可以...

    西南交通大学-离散数学编程作业-关系矩阵求闭包

    编程题目:基于关系的矩阵表示,实现关系的自反闭包、对称闭包、传递闭包运算,并计算A上的关系R={,b&gt;,,a&gt;,,c&gt;,,d&gt;}的自反闭包、对称闭包、传递闭包,其中A={a,b,c,d}. 编程内容及要求: 编写程序,基于关系的矩阵...

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

    代数闭包和向量闭包是凸分析领域中两个重要的概念,分别对应于线性空间中的特定类型集合的闭包。在凸分析中,闭包通常指的是某种极限过程下集合的最小闭集合,它能够包含原集合以及所有可能的极限点。在凸分析中,对...

Global site tag (gtag.js) - Google Analytics