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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java中回调函数详解

發布時間:2023/12/9 java 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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接口
/*** 1.CallBack is only an interface. And have a simple method.*/ public interface CallBack {public void notifyToUser(); }
  • WeChat類
package wechat;/****/ public class WeChat implements CallBack{public String weChatId;//wechat idpublic String name;//實際用戶名public double money;//充值金額public Server server = new Server();//維持一個Server的引用public WeChat(String name,double money){this.name = name;this.money = money;}public void pay(){//充值System.out.println("01. 微信客戶端接到用戶"+this.name+"充值的請求,準備調用方法payToTelecom,進行充值:");server.payToTelecom(WeChat.this);//將自己【WeChat這個對象傳入參數中】System.out.println("05. 充值成功消息已通知用戶,payToTelecom()調用完畢");}//實現Callback中通知用戶的方法@Overridepublic void notifyToUser() {System.out.println("04. 尊敬的客戶,您已成功充值100元。" +"查詢余額請直接回復102、登錄歡go網站(www.189.cn)、歡go客戶端。[中國電信上海公司]");} }
  • Server類
package wechat;public class Server {public void payToTelecom(WeChat weChatUser){//給中國移動支付System.out.println("02. 向中國電信為用戶:"+weChatUser.name+"支付"+weChatUser.money+"元");System.out.println("03. 收取客戶:"+weChatUser.name+" 0.1%的手續費");this.notifyToWeChat(weChatUser);}public void notifyToWeChat(WeChat weChatUser){weChatUser.notifyToUser();} }
  • TestMain類
package wechat;public class TestMain {public static void main(String[] args) {WeChat weChat = new WeChat("LittleLawson", 100);weChat.pay();} }

上述代碼可在如下鏈接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中回调函数详解的全部內容,希望文章能夠幫你解決所遇到的問題。

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