基于Java 談回調(diào)函數(shù)
雜談
還是習(xí)慣,寫點(diǎn)什么之前,都喜歡來點(diǎn)雜談。
最近都在搞微信的開發(fā),終于在昨晚進(jìn)入測(cè)試階段了,好快就測(cè)出 bug 來,但也好快修復(fù)了。這也讓我更擔(dān)心。
雖說是進(jìn)入內(nèi)測(cè)階段,但那代碼的結(jié)構(gòu)也真太難看了,還得好好重構(gòu)一下。遲點(diǎn)得寫寫關(guān)于這微信公眾號(hào)的開發(fā)文章。下次再詳談。
今天開始了三天半的小長假,但我還是堅(jiān)守在學(xué)校。有點(diǎn)不知道為了什么。
剛給 wp 裝了個(gè) markdown 插件,爽歪歪!!
在寫這篇文章的時(shí)候,還是用著 wordpress 的,但在發(fā)表的時(shí)候,已經(jīng)換成 hexo 了。原因:沒有找到一個(gè)完美支持 markdown 的插件,越來越覺得 wp 很臃腫,于是,就擁抱了小蘿莉 hexo 了。哈哈。
還有,今天微博看到的一個(gè)很贊的神器 GitBook ,分享一下:
Build beautiful programming books and exercises using GitHub/Git and Markdown.
正題,談回調(diào)函數(shù) (Callback)
解釋(引用于百度百科):
回調(diào)函數(shù)就是一個(gè)通過函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個(gè)函數(shù),當(dāng)這個(gè)指針被用來調(diào)用其所
指向的函數(shù)時(shí),我們就說這是回調(diào)函數(shù)。回調(diào)函數(shù)不是由該函數(shù)的實(shí)現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時(shí)由另外的一方調(diào)
用的,用于對(duì)該事件或條件進(jìn)行響應(yīng)。
機(jī)制(引用于百度百科):
⑴定義一個(gè)回調(diào)函數(shù);
⑵提供函數(shù)實(shí)現(xiàn)的一方在初始化的時(shí)候,將回調(diào)函數(shù)的函數(shù)指針注冊(cè)給調(diào)用者;
⑶當(dāng)特定的事件或條件發(fā)生的時(shí)候,調(diào)用者使用函數(shù)指針調(diào)用回調(diào)函數(shù)對(duì)事件進(jìn)行處理。
意義(個(gè)人理解):
調(diào)用者和被調(diào)用者的關(guān)系簡單化,互相不用關(guān)心對(duì)方的邏輯處理,不用關(guān)系對(duì)方都程序是怎么的,只關(guān)系返回值,這種基于返回值
的機(jī)制很好地使兩者的關(guān)系簡單,明了。
上代碼,以下講述阿 Ben 去飯?zhí)贸燥埖墓适?/p>
接口 Callback
接口定義事情 Done 了之后應(yīng)該做些什么
public interface Callback { public void Done(String str); }
Ben 類
阿 Ben 餓了,于是要去 have lunch,他叫了 Aunt 幫他煮個(gè)飯,調(diào)用 Aunt 的 cookMeal 方法,于是 Aunt 就去煮了,至于怎么煮,Ben 就不用管了,只要煮好了,就調(diào)用 Done,給飯阿 Ben 吃就可以了。
public class Ben implements Callback { public void havelunch(Aunt aunt){ aunt.cookMeal(this); } @Override public void Done(String str) { System.out.println(str); } }
Aunt 類
賦值給 str 就是煮飯的過程,煮好之后,就把結(jié)果(飯菜)返回給主函數(shù)(Ben)。
public class Aunt { String str; public void cookMeal(Callback callback){ str=" 香噴噴的飯菜來咯 "; // 這個(gè)就是煮飯的過程 callback.Done(str); } }
測(cè)試類
public class test { /** * @param args */ public static void main(String[] args) { Aunt class2=new Aunt(); Ben class1=new Ben(); class1.havelunch(class2); } }
結(jié)果:
剛才阿姨在煮飯的時(shí)候,阿 Ben 是傻乎乎地站在那里等,等同于是在陪阿姨做飯,這個(gè)就是同步回調(diào)。
時(shí)間怎么可以這么浪費(fèi)的呢。下面來看看異步回調(diào)。
異步回調(diào)
這個(gè)時(shí)候,阿姨還是規(guī)規(guī)矩矩地做飯。而啊 Ben,得同時(shí)做點(diǎn)事情。所以只需要修改 Ben 類。
public class Ben implements Callback { public void havelunch(final Aunt aunt){ new Thread(new Runnable() { //new 一個(gè)新的線程去做這個(gè)事情,并等待返回結(jié)果 @Override public void run() { aunt.cookMeal(Ben.this); } }).start(); play(); // 在阿姨做飯的時(shí)候可以玩一會(huì)手機(jī)先嘛。就不用傻傻地等了,阿姨煮好飯會(huì)喊吃的了。 } public void play(){ System.out.println(" 玩手機(jī),刷微博,朋友圈,聊扣扣 "); } @Override public void Done(String str) { System.out.println(str); } }
結(jié)果:
總結(jié):
回調(diào)函數(shù)就是那么一回事。
今天在一篇 nodejs 的文章看到了一句話是這么說的:
在代碼中,異步編程的直接體現(xiàn)就是回調(diào)。異步編程依托于回調(diào)來實(shí)現(xiàn),但不能說使用了回調(diào)后程序就異步化了。
說的不就是這個(gè)道理么。呵呵。
以上是我個(gè)人的理解,如有錯(cuò)誤,望指出。
相關(guān)文章
Spring之spring-context-indexer依賴詳解
這篇文章主要介紹了Spring之spring-context-indexer依賴詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11Java實(shí)現(xiàn)局域網(wǎng)IP地址掃描
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)局域網(wǎng)IP地址掃描,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05JSR303校驗(yàn)注解和自定義校驗(yàn)注解的使用
這篇文章主要介紹了JSR303校驗(yàn)注解和自定義校驗(yàn)注解的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09關(guān)于SpringMVC中數(shù)據(jù)綁定@ModelAttribute注解的使用
這篇文章主要介紹了關(guān)于SpringMVC中數(shù)據(jù)綁定@ModelAttribute注解的使用,SpringMVC是一個(gè)基于Spring框架的Web框架,它提供了一種簡單、靈活的方式來開發(fā)Web應(yīng)用程序,在開發(fā)Web應(yīng)用程序時(shí),我們需要將用戶提交的數(shù)據(jù)綁定到我們的Java對(duì)象上,需要的朋友可以參考下2023-07-07SpringBoot同時(shí)啟動(dòng)不同端口圖示解析
這篇文章主要介紹了SpringBoot同時(shí)啟動(dòng)不同端口圖示解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02spring aop execution表達(dá)式的用法
這篇文章主要介紹了spring aop execution表達(dá)式的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07SprinBoot如何集成參數(shù)校驗(yàn)Validator及參數(shù)校驗(yàn)的高階技巧
這篇文章主要介紹了SprinBoot如何集成參數(shù)校驗(yàn)Validator及參數(shù)校驗(yàn)的高階技巧包括自定義校驗(yàn)、分組校驗(yàn),本文分步驟給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05