最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2020年10月28日 15:20:40   作者:小z同學  
這篇文章主要介紹了如何用匿名內(nèi)部類實現(xiàn) Java 同步回調(diào),幫助大家更好的理解和學習Java,感興趣的朋友可以了解下

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

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

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

不如先思考兩個問題:

  • 棧底對棧頂通常是不可見的,但是棧頂有時需要直接調(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ù)需求如下:

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

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

相應代碼如下:

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)部類的方式

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

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

相應代碼如下:

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] http://m.fzitv.net/article/192275.htm

[3] http://m.fzitv.net/article/105016.htm

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

相關(guān)文章

  • SpringBoot數(shù)據(jù)庫初始化datasource配置方式

    SpringBoot數(shù)據(jù)庫初始化datasource配置方式

    這篇文章主要為大家介紹了SpringBoot數(shù)據(jù)庫初始化datasource配置方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • SpringBoot+WebSocket實現(xiàn)即時通訊的方法詳解

    SpringBoot+WebSocket實現(xiàn)即時通訊的方法詳解

    這篇文章主要為大家詳細介紹了如何利用SpringBoot+WebSocket實現(xiàn)即時通訊功能,文中示例代碼講解詳細,對我們學習或工作有一定參考價值,需要的可以參考一下
    2022-05-05
  • HTTP中g(shù)et和post的區(qū)別詳解

    HTTP中g(shù)et和post的區(qū)別詳解

    這篇文章主要為大家詳細介紹了HTTP中g(shù)et和post的區(qū)別,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • springboot整合JPA過程解析

    springboot整合JPA過程解析

    這篇文章主要介紹了springboot整合JPA過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • java實現(xiàn)簡單中國象棋

    java實現(xiàn)簡單中國象棋

    這篇文章主要為大家詳細介紹了java實現(xiàn)簡單中國象棋,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 實現(xiàn)Java線程的取值并返回的方法

    實現(xiàn)Java線程的取值并返回的方法

    在本篇文章中我們給大家分享了關(guān)于Java線程的取值并返回的實現(xiàn)方法,對此有需要的朋友們可以跟著學習參考下。
    2018-10-10
  • Java并發(fā)包工具類CountDownLatch的應用詳解

    Java并發(fā)包工具類CountDownLatch的應用詳解

    CountDownLatch是Java并發(fā)包中非常實用的一個工具類,它可以幫助我們實現(xiàn)線程之間的同步和協(xié)作。本文主要介紹了CountDownLatch的應用場景及最佳實踐,希望對大家有所幫助
    2023-04-04
  • Java實戰(zhàn)之醫(yī)院管理系統(tǒng)的實現(xiàn)

    Java實戰(zhàn)之醫(yī)院管理系統(tǒng)的實現(xiàn)

    這篇文章主要介紹了如何利用Java實現(xiàn)醫(yī)院管理系統(tǒng),文中用到的技術(shù)有:SpringBoot、Layui、Freemaker等,感興趣的同學可以了解一下
    2022-04-04
  • 詳解Java中ArrayList類

    詳解Java中ArrayList類

    這篇文章主要介紹了Java中ArrayList類,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • Java實現(xiàn)擲骰子控制臺和窗體兩種方法

    Java實現(xiàn)擲骰子控制臺和窗體兩種方法

    這篇文章主要為大家詳細介紹了Java實現(xiàn)擲骰子控制臺和窗體兩種方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08

最新評論

修水县| 汉川市| 崇左市| 博客| 芮城县| 水富县| 定结县| 米泉市| 青海省| 永兴县| 揭西县| 丹凤县| 禹州市| 石渠县| 墨脱县| 襄汾县| 新沂市| 徐闻县| 荥经县| 麟游县| 遵化市| 南皮县| 类乌齐县| 黔西| 平陆县| 澎湖县| 营山县| 安溪县| 桦川县| 潞西市| 桦川县| 靖西县| 万山特区| 台北县| 青神县| 喀喇沁旗| 武邑县| 桃园县| 富宁县| 基隆市| 城口县|