Java實現(xiàn)回調(diào)的寫法

本篇內(nèi)容介紹了“Java實現(xiàn)回調(diào)的寫法”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

專業(yè)從事成都網(wǎng)站設(shè)計、做網(wǎng)站、成都外貿(mào)網(wǎng)站建設(shè)公司,高端網(wǎng)站制作設(shè)計,微信平臺小程序開發(fā),網(wǎng)站推廣的成都做網(wǎng)站的公司。優(yōu)秀技術(shù)團隊竭力真誠服務(wù),采用H5技術(shù)+CSS3前端渲染技術(shù),響應(yīng)式網(wǎng)站建設(shè),讓網(wǎng)站在手機、平板、PC、微信下都能呈現(xiàn)。建站過程建立專項小組,與您實時在線互動,隨時提供解決方案,暢聊想法和感受。

1. 引言

在計算機程序設(shè)計中,回調(diào)函數(shù),簡稱回調(diào)(Callback),是指通過函數(shù)參數(shù)傳遞到其他代碼的,某一塊可執(zhí)行代碼的引用。這一設(shè)計允許了底層代碼調(diào)用在高層定義的子程序。

以上是維基百科對“回調(diào)函數(shù)”的定義。對于回調(diào),不同的語言有不同的回調(diào)形式,例如:

  • C、C++ 允許將函數(shù)指針作為參數(shù)傳遞;

  • JavaScript、Python 允許將函數(shù)名作為參數(shù)傳遞。

本文將介紹 Java 實現(xiàn)回調(diào)的四種寫法:

  • 反射;

  • 直接調(diào)用;

  • 接口調(diào)用;

  • Lambda表達式。

在開始之前,先介紹下本文代碼示例的背景,在 main 函數(shù)中,我們異步發(fā)送一個請求,并且指定處理響應(yīng)的回調(diào)函數(shù),接著 main 函數(shù)去做其他事,而當(dāng)響應(yīng)到達后,執(zhí)行回調(diào)函數(shù)。

2. 反射

Java 的反射機制允許我們獲取類的信息,其中包括類的方法。我們將以 Method 類型去獲取回調(diào)函數(shù),然后傳遞給請求函數(shù)。示例如下:

Request 類中的 send 方法有兩個參數(shù) clazz、method,分別是Class 類型和 Method 類型,這里的 method 參數(shù)就是待傳入的回調(diào)函數(shù),而為了通過 invoke 方法進行反射調(diào)用,還需要一個實例,所以將回調(diào)函數(shù)所在的類的 Class 對象作為參數(shù)傳遞進來,通過 newInstance 構(gòu)造一個對象,將順利通過 invoke 反射調(diào)用。

public class Request{    public void send(Class clazz, Method method) throws Exception {        // 模擬等待響應(yīng)        Thread.sleep(3000);        System.out.println("[Request]:收到響應(yīng)");        method.invoke(clazz.newInstance());    }}

CallBack 類很簡單,只有一個 processResponse 方法,用于當(dāng)作回調(diào)函數(shù),處理響應(yīng)。

public class CallBack {    public void processResponse() {        System.out.println("[CallBack]:處理響應(yīng)");    }}

我們在 main 方法中,新開了一個線程去發(fā)送請求,并且把需要的 CallBack.class 和 processResponse 方法傳遞進去。

public class Main {    public static void main(String[] args) throws Exception {        Request request = new Request();        System.out.println("[Main]:我開個線程去異步發(fā)請求");        new Thread(() -> {            try {                request.send(CallBack.class, CallBack.class.getMethod("processResponse"));            } catch (Exception e) {                e.printStackTrace();            }        }).start();        System.out.println("[Main]:請求發(fā)完了,我去干點別的");        Thread.sleep(100000);    }}/** Output:[Main]:我開個線程去異步發(fā)請求[Main]:請求發(fā)完了,我去干點別的[Request]:收到響應(yīng)[CallBack]:處理響應(yīng)*/

這種寫法需要傳遞的參數(shù)十分繁瑣。下面介紹一種簡單的寫法,直接調(diào)用。

3. 直接調(diào)用

我們來改寫下 send 方法的參數(shù),改為一個 CallBack 類型參數(shù)。如下:

在 send 方法中我們不使用反射,改為直接通過對象來調(diào)用方法。

public class Request{    public void send(CallBack callBack) throws Exception {        // 模擬等待響應(yīng)        Thread.sleep(3000);        System.out.println("[Request]:收到響應(yīng)");        callBack.processResponse();    }}

main 函數(shù)中,我們 new 了一個 CallBack 對象作為參數(shù)傳遞給 send 方法。

public class Main {    public static void main(String[] args) throws Exception {        Request request = new Request();        System.out.println("[Main]:我開個線程去異步發(fā)請求");        CallBack callBack = new CallBack();        new Thread(() -> {            try {                request.send(callBack);            } catch (Exception e) {                e.printStackTrace();            }        }).start();        System.out.println("[Main]:請求發(fā)完了,我去干點別的");        Thread.sleep(100000);    }}

這種實現(xiàn)方式十分簡單,但是存在的問題是不符合修改封閉原則。也就是說當(dāng)我們想要換一種“處理響應(yīng)”的方法時,將必須去修改 CallBack 類的 processRequest()方法。而如果將 CallBack 類改為接口,我們就可以僅更換 CallBack 的實現(xiàn)了。下面請看接口調(diào)用的寫法。

4. 接口調(diào)用

首先將 CallBack 類改為接口。

public interface CallBack {    public void processResponse();}復(fù)制代碼

再新增一個 CallBack 接口的實現(xiàn)類 CallBackImpl。

public class CallBackImpl implements CallBack {    @Override    public void processResponse() {        System.out.println("[CallBack]:處理響應(yīng)");    }}

Request 類不變。Main 類中的 main 方法將實例化一個 CallBackImpl,然后通過 CallBack 接口傳遞進去。

public class Main {    public static void main(String[] args) throws Exception {        Request request = new Request();        System.out.println("[Main]:我開個線程去異步發(fā)請求");        CallBack callBack = new CallBackImpl();        new Thread(() -> {            try {                request.send(callBack);            } catch (Exception e) {                e.printStackTrace();            }        }).start();        System.out.println("[Main]:請求發(fā)完了,我去干點別的");        Thread.sleep(100000);    }}

5. Lambda表達式

上述方法已經(jīng)介紹的差不多了,最后我們再介紹一種更加簡潔的寫法,通過使用 Lamda 表達式,將不用新增一個 CallBack 接口的實現(xiàn)類。下面請看改寫的 main 方法:

public class Main {    public static void main(String[] args) throws Exception {        Request request = new Request();        System.out.println("[Main]:我開個線程去異步發(fā)請求");        new Thread(() -> {            try {                request.send(()-> System.out.println("[CallBack]:處理響應(yīng)"));            } catch (Exception e) {                e.printStackTrace();            }        }).start();        System.out.println("[Main]:請求發(fā)完了,我去干點別的");        Thread.sleep(100000);    }}

我們既不用去新增實現(xiàn)類,也不用去實例化,只需要傳遞 Lambda 表達式就可以完成回調(diào)了

“Java實現(xiàn)回調(diào)的寫法”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

文章題目:Java實現(xiàn)回調(diào)的寫法
URL標(biāo)題:http://bm7419.com/article4/igshoe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃網(wǎng)站維護、做網(wǎng)站、虛擬主機微信小程序、企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化