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