成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

百家爭鳴 Java需要引入閉包嗎?

開發 后端
最近有很多人呼吁要在Java的新版本中引入閉包。那么Java或者說 OOPL (面向對象編程語言)需要引入閉包嗎?有了對象還需要閉包嗎?本文是筆者的一些看法,希望大家來一起辯論。

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

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

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

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

下面是一個閉包的例子 (由于Java現在不支持閉包,這個閉包的例子是用Python寫的,參見了《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變量 就是一個 相對于函數incr 的自由變量(它在 函數incr 的外部作用域上,但又不在全局作用域上),內部函數incr 可以引用和使用這個變量。這個例子主要模擬一個計數器。

運行下面的代碼

Java代碼

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

就會打印出

    7

    8

我們發現 內部函數(incr)不但可以引用其自身定義的變量,還可以引用外部函數(counter)定義的變量?;蛘哒f 內部函數(閉包) 可以記憶狀態, 它可以根據 它記憶的狀態 來執行不同的操作。 而外部函數負責初始化狀態(內部函數需要記憶的狀態)。

那么為什么需要閉包,閉包的優勢是什么呢?我覺得就是可以記憶狀態,但對象也可以記憶狀態(通過對象的屬性)。那閉包和對象的區別是什么呢? 我覺得就因為閉包是函數而不是對象。我們會發現,如果用面向對象的方式來表達閉包內部函數(閉包)就像 對象的方法而外部函數  對象的構造器。構造器用來初始化對象狀態而對象的方法可以根據 對象的狀態 來執行不同的操作。

好!下面我們用面向對象的方式 創建一個 計數器(實現和上例一樣的功能,用Java實現)。

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.  }  

運行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. }  

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

    7

    8

那么Java(有了對象)還需要引入閉包嗎?我覺得不需要,因為對象完全可以模擬閉包的行為,而且對象才是OOP 的一級元素。閉包是函數式編程(FP)中的概念,引入閉包就相當于引入FP,這只會破壞Java的純粹與簡單。

【編輯推薦】

  1. Java虛擬機幾個命令行參數說明
  2. Java虛擬機發展回顧 為跨平臺而生
  3. Java虛擬機概念及體系結構
  4. 在Netbeans上安裝JavaFX插件
  5. JavaBean中使用JDBC連接進行事務處理
責任編輯:彭凡 來源: javaeye
相關推薦

2014-08-26 14:24:09

華為HCC華為云計算大會云計算

2009-10-21 15:35:22

綜合布線市場

2010-01-11 09:00:12

JVMJava 7JDK 7

2010-06-01 10:13:10

2010-08-30 10:38:00

2013-01-08 09:32:46

SaaSOracleSAP

2013-02-19 09:34:53

BYOD解決方案華為

2012-12-17 10:59:50

云計算公有云

2012-07-05 09:01:24

云計算Amazon微軟

2009-04-15 09:02:03

2017-11-17 08:58:00

智能無人航運

2010-05-19 15:35:32

2015-12-30 20:17:31

安智超級碗

2010-04-19 09:51:52

2018-04-18 10:19:27

RSA大會區塊鏈云安全

2021-04-25 09:17:09

工信部計算技術云計算

2022-11-02 13:42:08

AI語言模型

2018-04-28 08:19:46

首都網絡安全日網絡安全日網絡安全

2021-12-25 21:57:57

OpenSCA

2022-05-26 09:30:43

WiFi網絡技術
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产成人综合亚洲欧美94在线 | 国产精品久久影院 | 一区二区中文字幕 | 色偷偷人人澡人人爽人人模 | 亚洲精品3 | 欧美成年人视频在线观看 | 91视频三区 | 久久久久久蜜桃一区二区 | 一级片在线观看视频 | 希岛爱理在线 | 91在线电影 | 欧美色图另类 | 91中文字幕在线观看 | 国产一区二区三区日韩 | 国产精品高清一区二区三区 | 亚洲国产成人精品在线 | 无码日韩精品一区二区免费 | 国产美女一区二区 | 日一区二区 | 在线视频久久 | 91精品中文字幕一区二区三区 | 农夫在线精品视频免费观看 | 久久99这里只有精品 | 成人精品鲁一区一区二区 | 国产在线中文字幕 | www.日本在线播放 | 日韩国产一区二区三区 | 亚洲一区二区三区在线视频 | 成人亚洲一区 | 欧美激情在线精品一区二区三区 | 亚洲精品自在在线观看 | 欧美精品在线看 | www.99热.com | 亚洲一区二区中文字幕在线观看 | 日韩高清中文字幕 | 91精品久久久久久久久中文字幕 | 国产农村妇女毛片精品久久麻豆 | 精品人伦一区二区三区蜜桃网站 | 日韩欧美在 | 五月婷婷中文 | 亚洲欧美一区二区三区在线 |