久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術(shù)文章
文章詳情頁

如何用匿名內(nèi)部類實現(xiàn) Java 同步回調(diào)

瀏覽:55日期:2022-08-21 18:28:32

在一個應(yīng)用系統(tǒng)中,不論使用何種編程語言,模塊之間要進行調(diào)用,僅存在三種方式:同步調(diào)用、異步調(diào)用、回調(diào)。本文就其中回調(diào)方式進行詳細解讀,并通過匿名內(nèi)部類的手段,在最后實現(xiàn)一個同步回調(diào)的過程。

一、回調(diào)的意義

在學(xué)習(xí)回調(diào)之前,我們需要知道使用回調(diào)的原因,和回調(diào)的應(yīng)用場景。

不如先思考兩個問題:

棧底對棧頂通常是不可見的,但是棧頂有時需要直接調(diào)用棧底 上級派下級做事,在此期間,下級可能需要通過上級獲取高權(quán)限的協(xié)助

而在本例中,回調(diào)方式被用來處理爬取后的大量返回數(shù)據(jù)。在業(yè)務(wù)層面,這些數(shù)據(jù)被安排在調(diào)用方進行處理,但是調(diào)用方卻沒有處理這些數(shù)據(jù)的足夠權(quán)限。于是,通過回調(diào),業(yè)務(wù)被很好的分層并且執(zhí)行。

二、如何實現(xiàn)同步回調(diào)

本文對同步回調(diào)的業(yè)務(wù)需求如下:

回調(diào)方調(diào)用調(diào)用方進行數(shù)據(jù)爬取 調(diào)用方調(diào)用回調(diào)方進行數(shù)據(jù)存儲 調(diào)用方調(diào)用回調(diào)方進行日志記錄

根據(jù)需求可以得到回調(diào)過程的時序圖:

如何用匿名內(nèi)部類實現(xiàn) Java 同步回調(diào)

相應(yīng)代碼如下:

public interface Handler { void handle(String info);}public class Task { private String info; private void setInfo(String info) { this.info = info; } public void call() { Crawler.getInstance().crawl(new Handler() { @Override public void handle(String info) {setInfo(info); } }); }}public class Crawler { private static Crawler instance = null; public static Crawler getInstance() { if (instance == null) { instance = new Crawler(); } return instance; } private String getInfo() { return 'the info from crawler'; } public void crawl(Handler handler) { handler.handle(getInfo()); }}

三、遇到的問題

如果我們使用代碼來實現(xiàn)上述回調(diào)過程,不難會發(fā)現(xiàn)這樣一個問題:Task調(diào)用Crawler,Crawler調(diào)用Handler,Hanlder調(diào)用Task。很明顯,此處存在一個環(huán),產(chǎn)生了循環(huán)依賴的問題,而接口可以為我們提供良好的解決方案。

如何用匿名內(nèi)部類實現(xiàn) Java 同步回調(diào)

四、為什么通過匿名內(nèi)部類的方式

用 Java 實現(xiàn)同步回調(diào)有許多方式,為什么我們要通過匿名內(nèi)部類的方式來實現(xiàn)回調(diào),直接回調(diào)不香嗎?

不妨先看看直接回調(diào)的順序圖:

如何用匿名內(nèi)部類實現(xiàn) Java 同步回調(diào)

相應(yīng)代碼如下:

public interface Handler { void handle(String info);}public class Task implements Handler{ private String info; private void setInfo(String info) { this.info = info; } public void call() { Crawler.getInstance().crawl(this); } @Override public void handle(String info) { setInfo(info); }}public class Crawler { private static Crawler instance = null; public static Crawler getInstance() { if (instance == null) { instance = new Crawler(); } return instance; } private String getInfo() { return 'the info from crawler'; } public void crawl(Handler handler) { handler.handle(getInfo()); }}

直接回調(diào)帶來的最大問題便是回調(diào)接口的暴露,也就是說回調(diào)接口不一定用于回調(diào),也可以用于直接訪問。這在業(yè)務(wù)層面的設(shè)計上是絕對不允許的,而匿名內(nèi)部類在執(zhí)行回調(diào)等特定業(yè)務(wù)的同時,可以很好的對外隱藏用于回調(diào)的接口。

五、總結(jié)

常規(guī)類通常無法對回調(diào)等特定接口作出限定,要么都可以訪問,要么都拒絕訪問。而內(nèi)部類通過犧牲自身的被訪問權(quán)限,提升了自身訪問外部類的能力,這使得其成為實現(xiàn)回調(diào)的首選方案。在JAVA8中,lambda表達式本質(zhì)上就是匿名內(nèi)部類的語法糖。

注:匿名內(nèi)部類本質(zhì)上是成員內(nèi)部類、局部內(nèi)部類的簡化寫法,這里將其統(tǒng)稱為內(nèi)部類。

參考鏈接

[1] <<Java核心技術(shù)>> 卷一

[2] https://www.cnblogs.com/xrq730/p/6424471.html

以上就是如何用匿名內(nèi)部類實現(xiàn) Java 同步回調(diào)的詳細內(nèi)容,更多關(guān)于Java 同步回調(diào)的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 欧美日韩中文字幕 | 日本免费在线 | 亚洲精品66 | 欧美日韩干 | 一级片视频免费 | 国产成人综合一区 | 精品在线一区二区三区 | 久久机热 | 国产免费国产 | 欧美亚洲一区 | 国产在线观看一区二区 | 色婷婷av一区二区三区大白胸 | 日韩在线成人av | 精品久久久久久久久久久久久久 | 欧美激情国产日韩精品一区18 | 日本在线网 | 亚洲综合色自拍一区 | 亚洲精品成人久久久 | 国产精品99久久久久久动医院 | 伊人二区 | 国产欧美精品一区二区三区 | 久久久蜜桃 | 久久久一区二区 | 国产精品美女视频一区二区三区 | 激情欧美日韩一区二区 | 品久久久久久久久久96高清 | 91极品国产 | 在线免费av观看 | 91亚洲高清 | 欧美午夜一区二区三区免费大片 | 91麻豆精品久久久久蜜臀 | 久久亚洲视频 | 国产在线小视频 | 国产在线一区二区三区 | 国产精品一区二区在线看 | 欧美中文在线观看 | 日本a在线| 亚洲a人| 日本中文字幕视频 | 久久不卡 | 国产3区|