理解回調

之前一直對回調這個概念不甚理解,對某一概念不理解但該概念又總總出現實在讓人不爽,今天總算忍無可忍,發動Google和知乎技能,總算對回調有了那么一點點感覺,而在查資料的過程中也有一些驚喜的發現。


我覺得,以下的兩個回答對理解回調很有幫助。

首先是futeng的回答,給出了一種通俗易懂的,由淺入深的,符合人類自然認知過程的解答。對于初學者來說,是一個很好的答案。futeng在其中提到

在Java社區的各種開源工具中,回調方法的使用俯拾即是。所以熟悉回調方法無疑能加速自己對開源輪子的掌握。網上搜了一些文章,奈何對回調方法的介紹大多只停留在什么是回調方法的程度上。本篇文章嘗試從回調方法怎么來的、為什么要使用回調方法以及在實際項目中如何使用等方面來介紹下。


而另一位黃兢成則給出了更一般性的回答,解釋了回調的本質

這個是程序上的概念。
本質上是叫別人做事,傳進去的額外信息。

并且提到一個自己從沒想到過的觀點——代碼和數據的統一性

再跟著,就來到計算機中比較詭異的地方。也就是代碼(code)和數據(data)的統一,這是一個檻,如果不打通這個,很多概念就不清楚。我們常常說計算機程序分成code和data兩部分。很多人就會覺得,code是會運行的,是動的,data是給code使用,是靜態的,這是兩種完全不同的東西。

其實code只是對行為的一種描述,比如有個機器人可以開燈,關燈,掃地。跟著我要機器人開燈,掃地,關燈。如果跟機器人約定好,0表示開燈,1表示關燈,2表示掃地。我發出指令,0 1 2 1 0。跟著就可以控制機器人開燈,掃地,關燈。再約定用二進制表示,兩位一個指令,就有一個數字串,0001110100,這個時候0001110100這串數字就描述了機器人的一系列動作,這個就是從一方面理解是code,可以它可以控制機器人的行為。但另一方面,它可以傳遞,可以記錄,可以修改,也就是數據。只要大家都協商好,code就可以編碼成data, 將data解釋運行的時候,也變成了code。

這個地方扯開了。我自己是不區分code和data的,統一稱為信息。那既然int max(int a, int b)中int,double等表示普通data的東西可以傳遞進去,憑什么表示code的函數就不可以傳進去了。有些語言確實是不區分的,它的function(表示code)跟int, double的地位是一樣的。這種語言就為函數是第一類值。

最后提到,如果認清了本質,什么委托,代理,監聽,觀察者之類的,其實都是一回事。

其實你理解了,根本不用去關心術語的。術語是別人要告訴你啊,或者你去告訴人啊,使用的一套約定的詞語。本質上就個東西,結果會有很多術語的。

跟著再將回調的概念進化,比如某人同時關心A,B,C,D,E,F事件,并且這些事件是一組的,比如敲鍵盤,鼠標移動,鼠標點擊等一組。將一組事件結合起來。在有些語言就變成一個接口,接口有N個函數。有些語言就映射成一個結構,里面放著N個函數指針。跟著就不是將單個函數指針傳進去,而是將接口,或者函數指針的結構傳進去。這些根據不同的用途,有些人叫它為代理啊,監聽者啊,觀察者啊等等。


具體到Java語言,經過查資料,發現有如下兩種方法

  1. http://blog.csdn.net/eyeooo/article/details/11971145
    這里有一個類Printer并且提供了一個Callback接口,當其它類委托Printer做某些事情時,要向Printer類提供某些信息,這些信息可以是Printer所要用到的數據,也可以是告訴Printer具體怎么做(這里可以看出數據和代碼統一了),具體到本例,就是一個Callback接口的具體實現。

  2. http://blog.csdn.net/xiaanming/article/details/8703708
    這里方式是某一個類Wang保留一個它要委托類的引用(其實上面方式中也是主類保留了Printer類的引用),而Wang本身要實現一個Callback接口,并將Wang的引用傳遞給被委托類。該種方式與方式1的區別于,Callback接口的實現是由第三方類實現而非調用類實現,而本方式是由調用類本身實現接口。


以上是自己的一種拙見,因為平時沒有應用過,難免理解有誤,希望大家指出。
在此記下,供自己以后回顧方便。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,431評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,637評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,555評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,900評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,629評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,976評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,976評論 3 448
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,139評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,686評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,411評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,641評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,129評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,820評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,233評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,567評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,362評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,604評論 2 380

推薦閱讀更多精彩內容

  • 相信大家都知道委托和事件,沒錯,委托和事件是用來傳遞和保存函數用的,那么 回調 呢,近段時間的學習中經常碰到 回調...
    道阻且長_行則將至閱讀 1,417評論 0 1
  • 概述 我們先看一下維基百科對回調函數的定義: 在計算機程序設計中,回調函數,或簡稱回調(Callback 即cal...
    zhangxiao閱讀 441評論 0 0
  • 最近經常看到“回調函數”這個概念,但不是很理解。為了弄明白回調函數,提出了以下三個問題:1.什么是回調函數 回調函...
    Sunbowbow閱讀 1,306評論 2 3
  • 個人小站 Github 簡書 前言 老司機們對于回調肯定熟悉得不能再熟悉了,但是新司機可能還是一臉懵逼的,我比較笨...
    wheat7閱讀 10,077評論 0 13
  • 回調函數我接觸了大半年,一直懵懵懂懂的。今天看了PHP的課程中,終于弄懂了什么是回調函數。說回調函數,網上文章有很...
    CK星空閱讀 214評論 0 0