Java中回调函数详解
Java的中回調(diào)函數(shù)詳解
0.前言
恕我直言,網(wǎng)上的blog大多數(shù)都是抄襲。而且參考價(jià)值不高。于是有了寫本博文的想法。
1.背景
看到網(wǎng)上一個(gè)blog,講得例子挺好,打電話那個(gè)也太俗套了嘛。這里我就以該blog中的例子,詳細(xì)介紹一下我理解的回調(diào)函數(shù)。
2.定義
這里說出我所認(rèn)為正確的定義【如果有道友不贊同,請(qǐng)不吝指正】:
 在A類中調(diào)用B類中的方法c【實(shí)現(xiàn)這個(gè)很簡(jiǎn)單,比如說:直接在A類中使用類B對(duì)象的b.method()即可】,然后B類反過來調(diào)用A類的方法D,這個(gè)方法D就叫做回調(diào)方法。
 實(shí)現(xiàn)過程如下:
- 定義一個(gè)接口CallBack【定義這個(gè)接口的目的在于抽象】
- Class A實(shí)現(xiàn)接口CallBack
- Class A中包涵一個(gè)類B的引用b
- Class B中有一個(gè)方法f,它的入?yún)⒂蠧allBack類對(duì)象callback;如f(CallBack callBack,String …)
 所以整個(gè)過程的調(diào)用關(guān)系就是:b.f => ··· => callBack.method => a.method【由b.f調(diào)用 callBack的method方法之前,我使用的符號(hào)是 => ··· =>,這就代表,調(diào)用回調(diào)函數(shù)可能不是一步完成的,中間可能有許多間接的其它函數(shù)調(diào)用】
3.需求
微信充值話費(fèi)相信大多數(shù)同志都有經(jīng)歷,通常需要如下幾個(gè)步驟:
- 01.首先微信客戶端調(diào)用服務(wù)器的接口進(jìn)行充值操作,
- 02.但是服務(wù)器端需要完成的內(nèi)容就比較多了,比如:銀行完成轉(zhuǎn)賬,運(yùn)營(yíng)商進(jìn)行充值等;如果需要一直等待【同步】服務(wù)器端完成這個(gè)操作,就需要花費(fèi)很長(zhǎng)的時(shí)間;但是如果采取異步就不會(huì)有這個(gè)問題。于是這個(gè)過程就采用異步手法。
- 03.在手機(jī)上完成微信充值之后會(huì)收到充值成功的界面,但是實(shí)際上充值并未成功【只是顯示微信繳費(fèi)成功而已】。
- 04.實(shí)際的成功【比如說10001給你發(fā)短信才表示實(shí)際充值成功】,那么這個(gè)發(fā)短信提示的功能就可以使用回調(diào)實(shí)現(xiàn)。
 上述這個(gè)過程,如果需要使用Java該怎么實(shí)現(xiàn)呢?
4.代碼
- CallBack接口
- WeChat類
- Server類
- TestMain類
上述代碼可在如下鏈接https://github.com/LittleLawson/TestCallBack中獲取,在代碼中,我添加了一個(gè)AliPay類,用于體現(xiàn)接口CallBack并非多余。
4.分析
上述代碼的調(diào)用過程如下:
 weChatUser.pay() => server.payToTelecomByWeChat() => server.notifyToWeChat() => weChatUser.notifyToUser()
 可以看到最開始由WeChat.pay()出發(fā),最后回到weChatUser.notifyToUser()方法【注意他們都是WeChat這個(gè)類中的方法】,故稱回調(diào)。
5.總結(jié)
想必還在思考回調(diào)函數(shù)的實(shí)現(xiàn)過程的各位同學(xué)和我一樣——還是Java入門者。這里我拋出幾個(gè)問題,大家可以思考一下:
-  01.為什么需要回調(diào)函數(shù)? 
 我認(rèn)為,回調(diào)函數(shù)的存在就是為了告訴調(diào)用者“我調(diào)用成功/失敗了”。比如說上述的微信充值例子,如果不知道自己是否充值成功/失敗,那要微信有個(gè)鳥用?【充值成功/失敗的標(biāo)準(zhǔn)是:運(yùn)營(yíng)商收到這筆錢,而不是微信收到,所以需要Server這個(gè)類觸發(fā)回調(diào),而不是WeChat這個(gè)類觸發(fā)回調(diào)。】
-  02.經(jīng)典的回調(diào)函數(shù)調(diào)用的使用案例有哪些? 
 這個(gè)我正在收集,后期會(huì)更新出來。
6.參考資料
-  https://blog.csdn.net/xiaanming/article/details/8703708/【好文章】 
-  https://www.cnblogs.com/liboBlog/p/7107440.html【本文素材源自于此】 
-  https://blog.csdn.net/jiayi_yao/article/details/51046526【對(duì)回調(diào)函數(shù)的理解正確,而且講解了為什么需要將notifyToUser()這個(gè)方法抽象成單獨(dú)的CallBack接口中。】 
-  https://blog.csdn.net/allen_zhao_2012/article/details/8056665#commentsedit【不過我認(rèn)為在這篇文章中,該作者對(duì)回調(diào)的理解是錯(cuò)誤的】 
總結(jié)
以上是生活随笔為你收集整理的Java中回调函数详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: linux cifs windows 慢
- 下一篇: Win10 jdk的安装以及环境变量的配
