中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用匿名內部類實現 Java 同步回調的方法

發布時間:2020-10-29 14:45:55 來源:億速云 閱讀:149 作者:Leah 欄目:開發技術

這篇文章運用簡單易懂的例子給大家介紹使用匿名內部類實現 Java 同步回調的方法,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

一、回調的意義

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

不如先思考兩個問題:

  • 棧底對棧頂通常是不可見的,但是棧頂有時需要直接調用棧底
  • 上級派下級做事,在此期間,下級可能需要通過上級獲取高權限的協助

而在本例中,回調方式被用來處理爬取后的大量返回數據。在業務層面,這些數據被安排在調用方進行處理,但是調用方卻沒有處理這些數據的足夠權限。于是,通過回調,業務被很好的分層并且執行。

二、如何實現同步回調

本文對同步回調的業務需求如下:

  1. 回調方調用調用方進行數據爬取
  2. 調用方調用回調方進行數據存儲
  3. 調用方調用回調方進行日志記錄

根據需求可以得到回調過程的時序圖:

使用匿名內部類實現 Java 同步回調的方法

相應代碼如下:

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

三、遇到的問題

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

使用匿名內部類實現 Java 同步回調的方法

四、為什么通過匿名內部類的方式

用 Java 實現同步回調有許多方式,為什么我們要通過匿名內部類的方式來實現回調,直接回調不香嗎?

不妨先看看直接回調的順序圖:

使用匿名內部類實現 Java 同步回調的方法

相應代碼如下:

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

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

五、總結

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

注:匿名內部類本質上是成員內部類、局部內部類的簡化寫法,這里將其統稱為內部類。

關于使用匿名內部類實現 Java 同步回調的方法就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

汉沽区| 麻阳| 新巴尔虎左旗| 凤阳县| 吉木乃县| 彭泽县| 达日县| 绥滨县| 隆昌县| 松潘县| 武隆县| 北碚区| 平武县| 隆安县| 沅江市| 随州市| 依安县| 岐山县| 于都县| 阆中市| 西乌珠穆沁旗| 江山市| 庆阳市| 若尔盖县| 霍山县| 西和县| 河津市| 镇江市| 石台县| 正镶白旗| 博乐市| 盐城市| 胶州市| 蒙阴县| 六盘水市| 乌鲁木齐县| 津南区| 武邑县| 兴化市| 南开区| 宁南县|