日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

内部类(闭包与回调)

發布時間:2024/9/30 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 内部类(闭包与回调) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://jiangzhengjun.iteye.com/blog/658354

動態語言的閉包是一個永恒的話題。閉包在編碼過程的方便和快捷使得動態語言的擁護者對它津津樂道,而靜態語言特別是Java語言的扇子們會拿出匿名內部類來說Java語言也有類似的功能。

?

JavaScript 中閉包的產生是由于 JavaScript 中允許內部 function,也就是在一個 function 內部聲明的 function 。內部 function 可以訪問外部 function 中的局部變量、傳入的參數和其它內部 function 。當內部 function 可以在包含它的外部 function 之外被引用時,就形成了一個閉包。這個時候,即便外部 function 已經執行完成,該內部 function 仍然可以被執行,并且其中所用到的外部 function 的局部變量、傳入的參數等仍然保留外部 function 執行結束時的值。下面是一個例子:


function Outer(){var i=0;function Inner(){alert(++i);}return Inner; } var inner = Outer(); inner();

因為函數Outer外的變量inner引用了函數Outer內的函數Inner,就是說:當函數Outer的內部函數Inner被函數Outer外的一個變量inner引用的時候,就創建了一個閉包。


閉包有什么作用:簡而言之,閉包的作用就是在Outer執行完并返回后,閉包使得Javascript的垃圾回收機制GC不會收回Outer所占用的資源,因為Outer的內部函數Inner的執行需要依賴Outer中的變量。


閉包是一個可調用的對象,它記錄了一些信息,這些信息來自于創建它的作用域。通過這個定義,可以看出內部類是面向對象的閉包,因為它不僅包含創建內部類的作用域的信息,還自動擁有一個指向此外圍類對象的引用,在此作用域內,內部類有權操作所有的成員,包括private成員。

?

C++有指針函數,可以實現回調。通過回調,對象能夠攜帶一些信息,這些信息允許它在稍后的某個時刻調用初始的對象。Java中沒有指針,回調是通過匿名類來實現的。

?

?

>>>回調的一種理解<<<

?

回調的基本原理跟好萊塢原則一樣,Don't call me,I'll call you.


編程上來說,一般使用一個庫或類時,是你主動調用人家的API,這個叫Call,有的時候這樣不能滿足需要,需要你注冊(注入)你自己的程序(比如一個對象),然后讓人家在合適的時候來調用你,這叫Callback。設計模式中的Observer就是例子:所有的觀察者都需要向自己關心的主題Observable注冊,然后主題在適當時機(主題類對象的屬性發生變化時)通知所有訂閱它的觀察者并更新,其中觀察者都實現了一個統一的Observer接口中的Update方法。


回調可以這樣具體的想:

我提供一個方法,在另一個對象中注冊,至于這個方法什么時候用,就要看這個對象怎么決定了,當這個對象調用這個方法時,就叫做回調

/**下面應用中ICallBack接口與Printer類好比是別人提供的API,*/ public interface ICallBack {//回調接口public void print(); }public class Printer {//API功能實現類ICallBack ic;void setCallBack(ICallBack ic) {this.ic = ic;}/* 供外界調用,即自己提供一個接口ICallBack,由外界PrintHandler去實現,再在適當時機回* 頭調用外界所提供的實現print方法。我沒有實現接口,但是我取得了一個實現接口的對象,而* 這個對象是外界類調用我的方法setCallBack()時所賦給我的,因此我可以在業務需要的地方* 來調用外界所提供的實現print方法*/void execute() {//... 固定算法 do some thingic.print(); //抽取變化的部分,由外界去實現//... 固定算法 do some thing} }/**下面是外界應用*/ public class PrintHandler {public static void main(String[] args) {Printer printer = new Printer();/** 注意下面的這項代碼片段,它給printer對象傳遞了一個實現ICallBack接口的匿名類,這* 樣Printer類的對象就取得了一個實現回調接口的類,因此Printer可以在任何時候調用接* 口中的方法*/printer.setCallBack(new ICallBack() {/* * print 方法在PrintHandler類中實現,但不在PrintHandler 類對象中調用,而是* 在Printer類對象中調用,這就是回調*/public void print() {System.out.println("This is a callback");}});// 這句話可以設置成當滿足某條件時再執行 printer.execute();} }

>>>回調的另一種理解<<<


在以下Adjustable接口和Base類中都定義了adjust()方法,這兩個方法的參數簽名相同,但是有著不同的調節功能。


interface Adjustable {//功能:調節溫度public void adjust(int temperature); }class Base {private int speed;//功能:調節速度public void adjst(int spped) {this.speed = speed;} }

可見雖然方法名同,但功能不同。

?

如果有一個Sub類同時具有調節溫度和調節速度的功能,那么Sub類需要繼承Base類,并實現Adjustable接口,但是以下代碼并不能滿足這一需求:



class Sub extends Base implements Adjustable {
private int temperature;


public void adjust(int temperature) {
this.temperature = temperature;
}
}


以上Sub類實現了Adjustable接口中的adjust()方法,并且把Base類中的adjust()方法覆蓋了,這意味著Sub類僅僅有調節溫度的功能,但失去了調節速度的功能。或以使用內部類來解決這一問題:

class Sub extends Base {private int temperature;// 調節溫度的真真實現在外部內中,但不提供給外部,只能通過內部類回調private void adjustTemperature(int temperature) {this.temperature = temperature;}// 實現回調接口private class Closure implements Adjustable {public void adjust(int temperature) {// 通過回調外部類中的實現來完成溫度調節功能adjustTemperature(temperature);}}// 獲取回調節引用public Adjustable getCallBackReference() {return new Closure();}public static void main(String[] args) {Sub sub = new Sub();// 具有調節速度的功能sub.adjst(1);/** 回調: 又具有調節溫度的功能* 客戶類先調用sub實例的getCallBackReference()方法,獲得* 內部類的Closure實例,然后再調用Closure實例的adjust()方* 法,該方法又調用Sub實例的adjustTemperature()方法。這種* 調用過程稱為回調。*/sub.getCallBackReference().adjust(2);} }

上面使Sub類既不覆蓋Base類的adujst()方法,又實現了Adjustable接口的adjust()方法。

?

回調實質上是指一個類盡管實際上實現了某種功能,但是沒有直接提供相應的接口,客戶類可以通過這個類的內部類的接口來獲得這種功能。而這個內部類本身并沒有提供真正的實現,僅僅調用外部類的實現。可見,回調充分發揮了內部類所具有的訪問外部類的實現細節的優勢。

?

觀察者模式也符合這一種理解:請參見XXXXXXXXXXXXX



總結

以上是生活随笔為你收集整理的内部类(闭包与回调)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。