日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

内部同步 外部同步 java_如何用匿名内部类实现 Java 同步回调

發布時間:2025/3/21 java 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 内部同步 外部同步 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 實現同步回調有許多方式,為什么我們要通過匿名內部類的方式來實現回調,直接回調不香嗎?

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

相應代碼如下:

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 同步回調的詳細內容,更多關于Java 同步回調的資料請關注其它相關文章!

總結

以上是生活随笔為你收集整理的内部同步 外部同步 java_如何用匿名内部类实现 Java 同步回调的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。