在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

您好,歡迎來電子發燒友網! ,新用戶?[免費注冊]

您的位置:電子發燒友網>源碼下載>java源碼下載>

詳解java 回調機制

大小:0.7 MB 人氣: 2017-09-28 需要積分:1

  代碼示例

  接下來看一下回調的代碼示例,代碼模擬的是這樣一種場景:老師問學生問題,學生思考完畢回答老師。

  首先定義一個回調接口,只有一個方法tellAnswer(int answer),即學生思考完畢告訴老師答案:

  /** * 回調接口 */publicinterfaceCallback{publicvoidtellAnswer( intanswer); }

  定義一個老師對象,實現Callback接口:

  /** * 老師對象 */publicclassTeacherimplementsCallback{privateStudent student;publicTeacher(Student student) { this.student = student; } publicvoidaskQuestion() { student.resolveQuestion( this); } @OverridepublicvoidtellAnswer( intanswer) { System.out.println( “知道了,你的答案是”+ answer); } }

  老師對象有兩個public方法:

  (1)回調接口tellAnswer(int answer),即學生回答完畢問題之后,老師要做的事情

  (2)問問題方法askQuestion(),即向學生問問題

  接著定義一個學生接口,學生當然是解決問題,但是接收一個Callback參數,這樣學生就知道解決完畢問題向誰報告:

  /** * 學生接口,Java學習交流QQ群:589809992 我們一起學Java! */publicinterfaceStudent{publicvoidresolveQuestion(Callback callback); }

  最后定義一個具體的學生叫Ricky:

  /** * 一個名叫Ricky的同學解決老師提出的問題 */publicclassRickyimplementsStudent{@OverridepublicvoidresolveQuestion(Callback callback) { // 模擬解決問題try{ Thread.sleep( 3000); } catch(InterruptedException e) { } // 回調,告訴老師作業寫了多久callback.tellAnswer( 3); } }

  在解決完畢問題之后,第16行向老師報告答案。

  寫一個測試類,比較簡單:

  /** * 回調測試,Java學習交流QQ群:589809992 我們一起學Java! */publicclassCallbackTest{@TestpublicvoidtestCallback() { Student student = newRicky(); Teacher teacher = newTeacher(student); teacher.askQuestion(); } }

  代碼運行結果就一行:

  知道了,你的答案是3

  簡單總結、分析一下這個例子就是:

  (1)老師調用學生接口的方法resolveQuestion,向學生提問

  (2)學生解決完畢問題之后調用老師的回調方法tellAnswer

  這樣一套流程,構成了一種雙向調用的關系。

  代碼分析

  分析一下上面的代碼,上面的代碼我這里做了兩層的抽象:

  (1)將老師進行抽象

  將老師進行抽象之后,對于學生來說,就不需要關心到底是哪位老師詢問我問題,只要我根據詢問的問題,得出答案,然后告訴提問的老師就可以了,即使老師換了一茬又一茬,對我學生而言都是沒有任何影響的

  (2)將學生進行抽象

  將學生進行抽象之后,對于老師這邊來說就非常靈活,因為老師未必對一個學生進行提問,可能同時對Ricky、Jack、Lucy三個學生進行提問,這樣就可以將成員變量Student改為List,這樣在提問的時候遍歷Student列表進行提問,然后得到每個學生的回答即可

  這個例子是一個典型的體現接口作用的例子,之所以這么說是因為我想到有些朋友可能不太明白接口的好處,不太明白接口好處的朋友可以重點看一下這個例子,多多理解。

  總結起來,回調的核心就是回調方將本身即this傳遞給調用方,這樣調用方就可以在調用完畢之后告訴回調方它想要知道的信息。回調是一種思想、是一種機制,至于具體如何實現,如何通過代碼將回調實現得優雅、實現得可擴展性比較高,一看開發者的個人水平,二看開發者對業務的理解程度。

  同步回調與異步回調

  上面的例子,可能有人會提出這樣的疑問:

  這個例子需要用什么回調啊,使用同步調用的方式,學生對象回答完畢問題之后直接把回答的答案返回給老師對象不就好了?

  這個問題的提出沒有任何問題,可以從兩個角度去理解這個問題。

  首先,老師不僅僅想要得到學生的答案怎么辦?可能這個老師是個更喜歡聽學生解題思路的老師,在得到學生的答案之前,老師更想先知道學生姓名和學生的解題思路,當然有些人可以說,那我可以定義一個對象,里面加上學生的姓名和解題思路不就好了。這個說法在我看來有兩個問題:

  (1)如果老師想要的數據越來越多,那么返回的對象得越來越大,而使用回調則可以進行數據分離,將一批數據放在回調方法中進行處理,至于哪些數據依具體業務而定,如果需要增加返回參數,直接在回調方法中增加即可

  (2)無法解決老師希望得到學生姓名、學生解題思路先于學生回答的答案的問題

  因此我認為簡單的返回某個結果確實沒有必要使用回調而可以直接使用同步調用,但是如果有多種數據需要處理且數據有主次之分,使用回調會是一種更加合適的選擇,優先處理的數據放在回調方法中先處理掉。

  另外一個理解的角度則更加重要,就是標題說的同步回調和異步回調了。例子是一個同步回調的例子,意思是老師向Ricky問問題,Ricky給出答案,老師問下一個同學,得到答案之后繼續問下一個同學,這是一種正常的場景,但是如果我把場景改一下:

  老師并不想One-By-One這樣提問,而是同時向Ricky、Mike、Lucy、Bruce、Kate五位同學提問,讓同學們自己思考,哪位同學思考好了就直接告訴老師答案即可。

  這種場景相當于是說,同學思考完畢完畢問題要有一個辦法告訴老師,有兩個解決方案:

  (1)使用Future+Callable的方式,等待異步線程執行結果,這相當于就是同步調用的一種變種,因為其本質還是方法返回一個結果,即學生的回答

  (2)使用異步回調,同學回答完畢問題,調用回調接口方法告訴老師答案即可。由于老師對象被抽象成了Callback接口,因此這種做法的擴展性非常好,就像之前說的,即使老師換了換了一茬又一茬,對于同學來說,只關心的是調用Callback接口回傳必要的信息即可

非常好我支持^.^

(0) 0%

不好我反對

(0) 0%

      發表評論

      用戶評論
      評價:好評中評差評

      發表評論,獲取積分! 請遵守相關規定!

      ?
      主站蜘蛛池模板: 久久久久久久成人午夜精品福利 | 国产免费糟蹋美女视频 | 在线观看h视频 | 性欧美成人免费观看视 | 凹厕所xxxxbbbb偷拍视频 | 黄色的视频网站在线观看 | 4tube高清性欧美 | 又黄又湿又爽吸乳视频 | 天天操夜夜操免费视频 | 综合aⅴ| 国产精品11页 | 国产视频一二区 | caopon在线| 天天摸日日摸人人看 | 奇米色吧 | 天天操天天操天天射 | 正在播放久久 | 天天干天天干天天干天天 | 久久天天躁狠狠躁狠狠躁 | 天天干夜夜欢 | 国产欧美综合在线 | 九九国产精品 | 一区二区三区视频观看 | 天天拍天天干 | 国产中文99视频在线观看 | 日韩中文视频 | 福利一级片 | 性欧美人与zooz | 免费人成年短视频在线观看免费网站 | 成人精品第一区二区三区 | 色域综合 | 一级一级毛片免费播放 | 天天干视频在线 | www.色视频| 丁香婷婷综合五月六月 | 欧美.亚洲.日本一区二区三区 | 久久夜色精品国产飘飘 | 99久久免费中文字幕精品 | 日本天天射| 中日韩欧美在线观看 | 国产在线视频不卡 |