溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java是否需要引入閉包

發(fā)布時(shí)間:2021-11-20 16:30:22 來(lái)源:億速云 閱讀:135 作者:柒染 欄目:編程語(yǔ)言

這篇文章將為大家詳細(xì)講解有關(guān)Java是否需要引入閉包,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

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

閉包是可以包含自由(未綁定)變量 的代碼塊;這些變量不是在這個(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è)閉包的例子 

Python代碼

def counter(start_at = 0):         count = [start_at]         def incr():             count[0] += 1            return count[0]         return incr     def counter(start_at = 0):      count = [start_at]      def incr():          count[0] += 1          return count[0]      return incr

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

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

Java代碼

count = counter(6)     print count()     print count()     count = counter(6)  print count()  print count()

就會(huì)打印出

7

8

我們發(fā)現(xiàn) 內(nèi)部函數(shù)(incr)不但可以引用其自身定義的變量,還可以引用外部函數(shù)(counter)定義的變量?;蛘哒f(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代碼

public class Counter {         private int startAt;         public Counter() {             this(0);         }         public Counter(int startAt) {             this.startAt = startAt;         }         public int incr(){             return ++ this.startAt;         }     }     public class Counter {   private int startAt;   public Counter() {    this(0);   }   public Counter(int startAt) {    this.startAt = startAt;   }   public int incr(){    return ++ this.startAt;   }  }

運(yùn)行Test類

Java代碼

public class Test{         public static void main(String[] args){             Counter counter = new Counter(6);             System.out.println(counter.incr());             System.out.println(counter.incr());         }     }     public class Test{   public static void main(String[] args){    Counter counter = new Counter(6);    System.out.println(counter.incr());    System.out.println(counter.incr());   }  }

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

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

關(guān)于Java是否需要引入閉包就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)
推薦閱讀:
  1. Python 閉包
  2. lua 閉包

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI