激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|正則表達式|C/C++|

香港云服务器
服務器之家 - 編程語言 - JAVA教程 - Java進階:用匿名內部類實現 Java 同步回調

Java進階:用匿名內部類實現 Java 同步回調

2020-10-30 00:16小z同學 JAVA教程

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

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

Java進階:用匿名內部類實現 Java 同步回調

一、回調的意義

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

不如先思考兩個問題:

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

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

二、如何實現同步回調

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

  • 回調方調用調用方進行數據爬取
  • 調用方調用回調方進行數據存儲
  • 調用方調用回調方進行日志記錄

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

Java進階:用匿名內部類實現 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 實現同步回調有許多方式,為什么我們要通過匿名內部類的方式來實現回調,直接回調不香嗎?

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

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表達式本質上就是匿名內部類的語法糖。

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

原文地址:https://www.cnblogs.com/zzzz76/p/13889869.html

延伸 · 閱讀

精彩推薦
808
主站蜘蛛池模板: 欧美精品123区 | 99成人在线 | xnxx 美女19| 视频一区二区不卡 | 国产1区2 | 久久久久久久久久久久久久国产 | www.91sese| 天天舔天天插 | 九九午夜视频 | 中文字幕在线观看精品 | 蜜桃网在线| 国产免费一级大片 | 香蕉久久久 | 欧美一级黄色免费 | 亚洲国产中文字幕 | 久久精品视频免费观看 | 欧美巨乳在线观看 | 欧美精品国产综合久久 | 中午字幕无线码一区2020 | 91久久91久久精品免观看 | 国产日韩线路一线路二 | 久久精品观看 | 亚洲国产精品久久久久婷婷老年 | 亚洲国产精品久久久久制服红楼梦 | 一本色道久久久888 国产一国产精品一级毛片 国产精品高潮视频 | 黄网站免费在线看 | 九九热视频这里只有精品 | 免费在线观看午夜视频 | 精品一区二区免费 | 色视频在线播放 | 久久超 | 免费一级肉体全黄毛片 | 久久亚洲精品久久国产一区二区 | 红杏亚洲影院一区二区三区 | 国产成人高清在线 | 圆产精品久久久久久久久久久 | 国产成人精品一区二区视频免费 | 国产成年人网站 | 免费国产视频大全入口 | 国内精品免费一区二区2001 | 九九热精品在线视频 |