日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
百家爭(zhēng)鳴 Java需要引入閉包嗎?

首先先了解一下什么是閉包

我們提供的服務(wù)有:網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、安義ssl等。為千余家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的安義網(wǎng)站制作公司

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

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

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

下面是一個(gè)閉包的例子 (由于Java現(xiàn)在不支持閉包,這個(gè)閉包的例子是用Python寫的,參見(jiàn)了《Python 核心編程》 )

Python代碼

 
 
 
  1. def counter(start_at = 0):     
  2.     count = [start_at]     
  3.     def incr():     
  4.         count[0] += 1    
  5.         return count[0]     
  6.     return incr    
  7.  
  8. def counter(start_at = 0):  
  9.     count = [start_at]  
  10.     def incr():  
  11.         count[0] += 1  
  12.         return count[0]  
  13.     return incr  

這里面count變量 就是一個(gè) 相對(duì)于函數(shù)incr 的自由變量(它在 函數(shù)incr 的外部作用域上,但又不在全局作用域上),內(nèi)部函數(shù)incr 可以引用和使用這個(gè)變量。這個(gè)例子主要模擬一個(gè)計(jì)數(shù)器。

運(yùn)行下面的代碼

Java代碼

 
 
 
  1. count = counter(6)     
  2. print count()     
  3. print count()    
  4.  
  5. count = counter(6)  
  6. print count()  
  7. print count()  

就會(huì)打印出

    7

    8

我們發(fā)現(xiàn) 內(nèi)部函數(shù)(incr)不但可以引用其自身定義的變量,還可以引用外部函數(shù)(counter)定義的變量。或者說(shuō) 內(nèi)部函數(shù)(閉包) 可以記憶狀態(tài), 它可以根據(jù) 它記憶的狀態(tài) 來(lái)執(zhí)行不同的操作。 而外部函數(shù)負(fù)責(zé)初始化狀態(tài)(內(nèi)部函數(shù)需要記憶的狀態(tài))。

那么為什么需要閉包,閉包的優(yōu)勢(shì)是什么呢?我覺(jué)得就是可以記憶狀態(tài),但對(duì)象也可以記憶狀態(tài)(通過(guò)對(duì)象的屬性)。那閉包和對(duì)象的區(qū)別是什么呢? 我覺(jué)得就因?yàn)殚]包是函數(shù)而不是對(duì)象。我們會(huì)發(fā)現(xiàn),如果用面向?qū)ο蟮姆绞絹?lái)表達(dá)閉包內(nèi)部函數(shù)(閉包)就像 對(duì)象的方法而外部函數(shù)  對(duì)象的構(gòu)造器。構(gòu)造器用來(lái)初始化對(duì)象狀態(tài)而對(duì)象的方法可以根據(jù) 對(duì)象的狀態(tài) 來(lái)執(zhí)行不同的操作。

好!下面我們用面向?qū)ο蟮姆绞?創(chuàng)建一個(gè) 計(jì)數(shù)器(實(shí)現(xiàn)和上例一樣的功能,用Java實(shí)現(xiàn))。

Java代碼

 
 
 
  1. public class Counter {     
  2.     private int startAt;     
  3.     public Counter() {     
  4.         this(0);     
  5.     }     
  6.     public Counter(int startAt) {     
  7.         this.startAt = startAt;     
  8.     }     
  9.     public int incr(){     
  10.         return ++ this.startAt;     
  11.     }     
  12. }    
  13.  
  14. public class Counter {  
  15.  private int startAt;  
  16.  public Counter() {  
  17.   this(0);  
  18.  }  
  19.  public Counter(int startAt) {  
  20.   this.startAt = startAt;  
  21.  }  
  22.  public int incr(){  
  23.   return ++ this.startAt;  
  24.  }  

運(yùn)行Test類

Java代碼

 
 
 
  1. public class Test{     
  2.     public static void main(String[] args){     
  3.         Counter counter = new Counter(6);     
  4.         System.out.println(counter.incr());     
  5.         System.out.println(counter.incr());     
  6.     }     
  7. }    
  8.  
  9. public class Test{  
  10.  public static void main(String[] args){  
  11.   Counter counter = new Counter(6);  
  12.   System.out.println(counter.incr());  
  13.   System.out.println(counter.incr());  
  14.  }  
  15. }  

會(huì)打印出(和上例打印輸出相同)

    7

    8

那么Java(有了對(duì)象)還需要引入閉包嗎?我覺(jué)得不需要,因?yàn)閷?duì)象完全可以模擬閉包的行為,而且對(duì)象才是OOP 的一級(jí)元素。閉包是函數(shù)式編程(FP)中的概念,引入閉包就相當(dāng)于引入FP,這只會(huì)破壞Java的純粹與簡(jiǎn)單。

【編輯推薦】

  1. Java虛擬機(jī)幾個(gè)命令行參數(shù)說(shuō)明
  2. Java虛擬機(jī)發(fā)展回顧 為跨平臺(tái)而生
  3. Java虛擬機(jī)概念及體系結(jié)構(gòu)
  4. 在Netbeans上安裝JavaFX插件
  5. JavaBean中使用JDBC連接進(jìn)行事務(wù)處理

分享標(biāo)題:百家爭(zhēng)鳴 Java需要引入閉包嗎?
標(biāo)題鏈接:http://www.dlmjj.cn/article/cocjgsj.html