溫馨提示×

溫馨提示×

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

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

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

發(fā)布時間:2021-07-23 16:14:28 來源:億速云 閱讀:178 作者:chen 欄目:編程語言

本篇內(nèi)容主要講解“怎么用匿名內(nèi)部類實現(xiàn)Java 同步回調(diào)”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么用匿名內(nèi)部類實現(xiàn)Java 同步回調(diào)”吧!

在一個應用系統(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è)務層面,這些數(shù)據(jù)被安排在調(diào)用方進行處理,但是調(diào)用方卻沒有處理這些數(shù)據(jù)的足夠權(quán)限。于是,通過回調(diào),業(yè)務被很好的分層并且執(zhí)行。

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

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

  • 回調(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)

相應代碼如下:

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)

相應代碼如下:

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

五、總結(jié)

  • 常規(guī)類不保證接口安全性:常規(guī)接口通??梢栽O(shè)定權(quán)限,但不可以指定訪問類,也就是說要么都可以訪問,要么都拒絕訪問。而內(nèi)部類中接口可以指定訪問類。

  • 內(nèi)部類保證接口安全性:內(nèi)部類接口通常是對外隱藏的,那么如何使得內(nèi)部類對指定訪問類暴露呢?方法很簡單,只需要通過外部類實例化內(nèi)部類,并對指定類傳參,便可以使得指定類對內(nèi)部類可訪問。

  • 內(nèi)部類的安全性加上其對外部類的完全權(quán)限,這使得其成為實現(xiàn)回調(diào)的首選方案。在JAVA8中,lambda表達式本質(zhì)上就是匿名內(nèi)部類的語法糖。

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

到此,相信大家對“怎么用匿名內(nèi)部類實現(xiàn)Java 同步回調(diào)”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學習!

向AI問一下細節(jié)

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

AI