如何用匿名內部類實現 Java 同步回調
在一個應用系統(tǒng)中,不論使用何種編程語言,模塊之間要進行調用,僅存在三種方式:同步調用、異步調用、回調。本文就其中回調方式進行詳細解讀,并通過匿名內部類的手段,在最后實現一個同步回調的過程。
一、回調的意義
在學習回調之前,我們需要知道使用回調的原因,和回調的應用場景。
不如先思考兩個問題:
- 棧底對棧頂通常是不可見的,但是棧頂有時需要直接調用棧底
- 上級派下級做事,在此期間,下級可能需要通過上級獲取高權限的協助
而在本例中,回調方式被用來處理爬取后的大量返回數據。在業(yè)務層面,這些數據被安排在調用方進行處理,但是調用方卻沒有處理這些數據的足夠權限。于是,通過回調,業(yè)務被很好的分層并且執(zhí)行。
二、如何實現同步回調
本文對同步回調的業(yè)務需求如下:
- 回調方調用調用方進行數據爬取
- 調用方調用回調方進行數據存儲
- 調用方調用回調方進行日志記錄
根據需求可以得到回調過程的時序圖:

相應代碼如下:
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());
}
}
三、遇到的問題
如果我們使用代碼來實現上述回調過程,不難會發(fā)現這樣一個問題:Task調用Crawler,Crawler調用Handler,Hanlder調用Task。很明顯,此處存在一個環(huán),產生了循環(huán)依賴的問題,而接口可以為我們提供良好的解決方案。

四、為什么通過匿名內部類的方式
用 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());
}
}
直接回調帶來的最大問題便是回調接口的暴露,也就是說回調接口不一定用于回調,也可以用于直接訪問。這在業(yè)務層面的設計上是絕對不允許的,而匿名內部類在執(zhí)行回調等特定業(yè)務的同時,可以很好的對外隱藏用于回調的接口。
五、總結
常規(guī)類通常無法對回調等特定接口作出限定,要么都可以訪問,要么都拒絕訪問。而內部類通過犧牲自身的被訪問權限,提升了自身訪問外部類的能力,這使得其成為實現回調的首選方案。在JAVA8中,lambda表達式本質上就是匿名內部類的語法糖。
注:匿名內部類本質上是成員內部類、局部內部類的簡化寫法,這里將其統(tǒng)稱為內部類。
參考鏈接
[1] <<Java核心技術>> 卷一
[2] http://www.dhdzp.com/article/192275.htm
[3] http://www.dhdzp.com/article/105016.htm
以上就是如何用匿名內部類實現 Java 同步回調的詳細內容,更多關于Java 同步回調的資料請關注腳本之家其它相關文章!
相關文章
SpringBoot數據庫初始化datasource配置方式
這篇文章主要為大家介紹了SpringBoot數據庫初始化datasource配置方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12
SpringBoot+WebSocket實現即時通訊的方法詳解
這篇文章主要為大家詳細介紹了如何利用SpringBoot+WebSocket實現即時通訊功能,文中示例代碼講解詳細,對我們學習或工作有一定參考價值,需要的可以參考一下2022-05-05
Java并發(fā)包工具類CountDownLatch的應用詳解
CountDownLatch是Java并發(fā)包中非常實用的一個工具類,它可以幫助我們實現線程之間的同步和協作。本文主要介紹了CountDownLatch的應用場景及最佳實踐,希望對大家有所幫助2023-04-04
Java實戰(zhàn)之醫(yī)院管理系統(tǒng)的實現
這篇文章主要介紹了如何利用Java實現醫(yī)院管理系統(tǒng),文中用到的技術有:SpringBoot、Layui、Freemaker等,感興趣的同學可以了解一下2022-04-04

