牛牛組合

          春風不相識,何事入羅幃?

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            5 隨筆 :: 2 文章 :: 1 評論 :: 0 Trackbacks
          今天在javaeye論壇里看到的帖子,認真地從頭看到尾,對閉包有了進一步的認識。感謝原帖樓主和所有回帖的朋友。

          原帖地址:http://www.javaeye.com/topic/412451
          主題:再論閉包
          作者:步行者
          對閉包感興趣的朋友可以移步去看看。

          首先,給出閉包的定義(定義說法比較多,本人偷懶,就直接從原帖里摘取了。):

          閉包   是可以包含自由(未綁定)變量 的代碼塊;這些變量不是在這個代碼塊或者任何全局上下文中定義的,而是在定義代碼塊的環(huán)境中定義。“閉包” 一詞來源于以下兩者的結(jié)合:要執(zhí)行的代碼塊(由于自由變量的存在,相關變量引用沒有釋放)和為自由變量提供綁定的計算環(huán)境(作用域)。


              可能上面的定義有點晦澀,下面看一下《Python 核心編程》 對 閉包 的解釋。


              如果在一個內(nèi)部函數(shù)里,對在外部作用域(但不是在全局作用域)的變量進行引用,那么內(nèi)部函數(shù)就被定義為閉包 。定義在外部函數(shù)內(nèi)的但由內(nèi)部函數(shù)引用或者使用的變量被稱為自由變量 。

           

          原帖中“liusong1111”回帖值得思考:
          [closure作為一等公民,可以被一個普通的變量引用、傳遞。在ruby里意味著它是Proc的一個對象(實例),自然可以調(diào)用Proc的方法(比如 call)。以java的視角,類是用來組織數(shù)據(jù)的,不是描述行為。而對于ruby,行為也是數(shù)據(jù),也可以用類描述,類也是對象,類的類還是對象,這才是 真正的Everything is Object。樓主受java和java所謂的OO的影響太深,評判這些問題時,應該眼光往外多看看,避免思維定勢。尤其應該深入學習一門帶閉包的語言, 看看它到底是怎么用的。]

          首先,我同意可以用OO模擬閉包的觀點,這已經(jīng)由原帖作者“步行者”給出詳細的例子了。但是這勢必在一定程度上會增加代碼的復雜度和臃腫度。我想,大部分時候大家更希望用更簡潔的方法去完成同樣的功能吧。

          另外,對于閉包會破壞OO的結(jié)構(gòu)的爭論,我更愿意從廣義的角度來理解OO的定義。正如上面引用中所說,“以java的視角,類是用來組織數(shù)據(jù)的,不是描述行為。而對于ruby,行為也是數(shù)據(jù),也可以用類描述,類也是對象,類的類還是對象”。如果采用閉包,那么這個內(nèi)部函數(shù)中可以定義局部變量,同時它本身就是行為,此時具有屬性和行為的閉包,何嘗不可以看做是OO的呢?
          個人的觀點是如果能達到以下兩條,那么我支持Java中引入閉包:

          1)引入閉包能夠在保證程序的可讀性的基礎上,簡化程序編寫的復雜度,降低代碼的臃腫度。
          2)引入閉包至少能夠保證在大部分情況下,程序的性能能夠保持或者得到提升。(這里排除了極限情況)

          本人對閉包的了解還遠遠不夠,計劃有空閑的時候,認真地學習下閉包的知識和相關的應用。

          歡迎討論。

          posted on 2009-07-29 02:33 電子牛 閱讀(285) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 金塔县| 安庆市| 四川省| 鸡西市| 象山县| 通海县| 衡水市| 西畴县| 土默特左旗| 祁东县| 体育| 桦川县| 荥经县| 高雄县| 泰来县| 西华县| 山东省| 海口市| 仁怀市| 确山县| 额尔古纳市| 铁岭县| 成安县| 南丰县| 大丰市| 哈密市| 金沙县| 龙游县| 广汉市| 行唐县| 古田县| 绥德县| 阿荣旗| 桂林市| 安新县| 山阴县| 建瓯市| 合江县| 射洪县| 中山市| 剑河县|