亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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

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

不如先思考兩個(gè)問題:

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

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

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

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

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

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

相應(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());
 }
}

三、遇到的問題

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

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

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

不妨先看看直接回調(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è)計(jì)上是絕對(duì)不允許的,而匿名內(nèi)部類在執(zhí)行回調(diào)等特定業(yè)務(wù)的同時(shí),可以很好的對(duì)外隱藏用于回調(diào)的接口。

五、總結(jié)

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

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

參考鏈接

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

[2] http://chabaoo.cn/article/192275.htm

[3] http://chabaoo.cn/article/105016.htm

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

相關(guān)文章

  • 關(guān)于RestTemplate中的Get請(qǐng)求

    關(guān)于RestTemplate中的Get請(qǐng)求

    這篇文章主要介紹了關(guān)于RestTemplate中的Get請(qǐng)求,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Springboot多數(shù)據(jù)源配置之整合dynamic-datasource方式

    Springboot多數(shù)據(jù)源配置之整合dynamic-datasource方式

    這篇文章主要介紹了Springboot多數(shù)據(jù)源配置之整合dynamic-datasource方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 詳解Java8新特性之interface中的static方法和default方法

    詳解Java8新特性之interface中的static方法和default方法

    這篇文章主要介紹了Java8新特性之interface中的static方法和default方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-08-08
  • C++和Java命令行繪制心形圖案

    C++和Java命令行繪制心形圖案

    這篇文章主要為大家詳細(xì)介紹了C++和Java命令行繪制心形圖案,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • Java獲取http和https協(xié)議返回的json數(shù)據(jù)

    Java獲取http和https協(xié)議返回的json數(shù)據(jù)

    本篇文章主要介紹了Java獲取http和https協(xié)議返回的json數(shù)據(jù) ,本篇文章提供兩個(gè)方法,幫助各位如何獲取http和https返回的數(shù)據(jù)。有興趣的可以了解一下。
    2017-01-01
  • 詳解SpringBoot依賴注入和使用配置文件

    詳解SpringBoot依賴注入和使用配置文件

    這篇文章主要介紹了SpringBoot依賴注入和使用配置文件的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01
  • Java網(wǎng)絡(luò)編程之簡(jiǎn)易聊天室的實(shí)現(xiàn)

    Java網(wǎng)絡(luò)編程之簡(jiǎn)易聊天室的實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了如何利用Java語言實(shí)現(xiàn)一個(gè)簡(jiǎn)易聊天室功能,可以實(shí)現(xiàn)運(yùn)行客戶端和連接服務(wù)器,文中的示例代碼講解詳細(xì),需要的可以了解一下
    2022-10-10
  • @Valid注解的作用及@Valid注解與@Validated的區(qū)別

    @Valid注解的作用及@Valid注解與@Validated的區(qū)別

    這篇文章主要介紹了@Valid注解的作用及@Valid注解與@Validated的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • SpringBoot創(chuàng)建自定義starter詳解

    SpringBoot創(chuàng)建自定義starter詳解

    這篇文章主要介紹了SpringBoot創(chuàng)建自定義starter詳解,Starter是Spring Boot中的一個(gè)非常重要的概念,Starter相當(dāng)于模塊,它能將模塊所需的依賴整合起來并對(duì)模塊內(nèi)的Bean根據(jù)環(huán)境(條件)進(jìn)行自動(dòng)配置,需要的朋友可以參考下
    2024-01-01
  • SpringBoot實(shí)現(xiàn)kafka多源配置的示例代碼

    SpringBoot實(shí)現(xiàn)kafka多源配置的示例代碼

    實(shí)際開發(fā)中,不同的topic可能來自不同的集群,所以就需要配置不同的kafka數(shù)據(jù)源,基于springboot自動(dòng)配置的思想,最終通過配置文件的配置,自動(dòng)生成生產(chǎn)者及消費(fèi)者的配置,本文介紹了SpringBoot實(shí)現(xiàn)kafka多源配置,需要的朋友可以參考下
    2024-06-06

最新評(píng)論