Java回呼函數的理解

來源:互聯網
上載者:User

       所謂回調,就是客戶程式C調用服務程式S中的某個函數A,然後S又在某個時候反過來調用C中的某個函數B,對於C來說,這個B便叫做回呼函數。例如Win32下的視窗過程函數就是一個典型的回呼函數。一般說來,C不會自己調用B,C提供B的目的就是讓S來調用它,而且是C不得不提供。由於S並不知道C提供的B姓甚名誰,所以S會約定B的介面規範(函數原型),然後由C提前通過S的一個函數R告訴S自己將要使用B函數,這個過程稱為回呼函數的註冊,R稱為註冊函數。Web Service以及Java的RMI都用到回調機制,可以訪問遠程伺服器程式。

    下面舉個通俗的例子:
    某天,我打電話向你請教問題,當然是個難題,^_^,你一時想不出解決方案,我又不能拿著電話在那裡傻等,於是我們約定:等你想出辦法後打手機通知我,這樣,我就掛掉電話辦其它事情去了。過了XX分鐘,My Phone響了,你興高采烈的說問題已經搞定,應該如此這般處理。故事到此結束。這個例子說明了“非同步+回調”的編程模式。其中,你後來打手機告訴我結果便是一個“回調”過程;My Phone號碼必須在以前告訴你,這便是註冊回呼函數;My Phone號碼應該有效並且手機能夠接收到你的呼叫,這是回呼函數必須符合介面規範。

    通過上面個人感覺到回調更多的應用就是結合非同步。比如:Ajax中js通過組件和伺服器的非同步通訊。

 

例:

    程式員A寫了一段程式(程式a),其中預留有回呼函數介面,並封裝好了該程式。程式員B要讓a調用自己的程式b中的一個方法,於是,他通過a中的介面回調自己b中的方法。目的達到。在C/C++中,要用回呼函數,被掉函數需要告訴調用者自己的指標地址,但在JAVA中沒有指標,怎麼辦?我們可以通過介面(interface)來實現定義回呼函數。
     假設我是程式員A,以下是我的程式a:

public class Caller<br />{<br /> public MyCallInterface mc; </p><p> public void setCallfuc(MyCallInterface mc)<br /> {<br /> this.mc= mc;<br /> } </p><p> public void call(){<br /> this.mc.method();<br /> }<br />}

 

  我還需要定義一個介面,以便程式員B根據我的定義編寫程式實現介面。

public interface MyCallInterface<br />{<br /> public void method(); </p><p>}

     於是,程式員B只需要實現這個介面就能達到回調的目的了:

public class B implements MyCallInterface<br />{<br /> public void method()<br /> {<br /> System.out.println("回調");<br /> } </p><p> public static void main(String args[])<br /> {<br /> Caller call = new Caller();<br /> call.setCallfuc(new B());<br /> call.call();<br /> }<br />}<br />

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.