深入浅出Java回调机制
前幾天看了一下Spring的部分源碼,發現回調機制被大量使用,覺得有必要把Java回調機制的理解歸納總結一下,以方便在研究類似于Spring源碼這樣的代碼時能更加得心應手。?
注:本文不想扯很多拗口的話來充場面,我的目的是希望以最簡明扼要的語言將Java回調的大概機制說清楚。好了,言歸正傳。?
一句話,回調是一種雙向調用模式,什么意思呢,就是說,被調用方在被調用時也會調用對方,這就叫回調。“If you call me, i will call back”。?
不理解?沒關系,先看看這個可以說比較經典的使用回調的方式:?
- class A實現接口InA ——背景1
- class A中包含一個class B的引用b ——背景2
- class B有一個參數為InA的方法test(InA a) ——背景3
- A的對象a調用B的方法傳入自己,test(a) ——這一步相當于you call me
- 然后b就可以在test方法中調用InA的方法 ——這一步相當于i call you back
是不是清晰一點了?下面再來看一個完全符合這個方式模板的例子?
(PS:這個例子來源于網絡,由于這個例子表現的功能極度拉風,令我感覺想想出一個超越它的例子確實比較困難,所以直接搬過來)?
現在應該對回調有一點概念了吧。?
可是問題來了,對于上面這個例子來說,看不出用回調有什么好處,直接在調用方法不就可以了,為什么要使用回調呢??
事實上,很多需要進行回調的操作是比較費時的,被調用者進行費時操作,然后操作完之后將結果回調給調用者。看這樣一個例子:?
可能上面這個例子你不能一眼看出個所以然來,因為其實這里A是作為一個內部匿名類存在的。好,不要急,讓我們把這個例子來重構一下:?
好了,現在就明白多了吧,完全可以轉化為上面所說的回調使用方式的模板。?
現在在來看看為什么要使用回調,取得連接getConnection();是費時操作,A希望由B來進行這個費時的操作,執行完了之后通知A即可(即所謂的i call you back)。這就是這里使用回調的原因。?
在網上看到了一個比喻,覺得很形象,這里借用一下:?
你有一個復雜的問題解決不了,打電話給你的同學,你的同學說可以解決這個問題,但是需要一些時間,那么你不可能一直拿著電話在那里等,你會把你的電話號碼告訴他,讓他解決之后打電話通知你。回調就是體現在你的同學又反過來撥打你的號碼。?
結合到前面所分析的,你打電話給你同學就是【you call me】,你同學解決完之后打電話給你就是【i call you back】。?
怎么樣,現在理解了吧???
---------------------------------以下為更新----------------------------------?
看了有些朋友的回帖,我又思考了一下,感覺自己之前對回調作用的理解的確存在偏差。?
下面把自己整理之后的想法共享一下,如果有錯誤希望指出!多謝!?
先說上面這段代碼,本來完全可以用模板模式來進行實現:?
如果改為回調實現是這樣的:?
可見摒棄了繼承抽象類方式的回調方式更加簡便靈活。不需要為了實現抽象方法而總是繼承抽象類,而是只需要通過回調來增加一個方法即可,更加的直觀簡潔靈活。這算是回調的好處之一。?
下面再給出一個關于利用回調配合異步調用的很不錯的例子?
回調接口:?
消息的發送者:?
消息的接收者:?
由上面這個例子可見,回調可以作為異步調用的基礎來實現異步調用。
轉載于:https://www.cnblogs.com/smilesmile/p/3833385.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的深入浅出Java回调机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软服务器探针产品,服务器云探针
- 下一篇: Android启示录——开始Androi