您好,登錄后才能下訂單哦!
這篇文章運用簡單易懂的例子給大家介紹使用匿名內(nèi)部類實現(xiàn) Java 同步回調(diào)的方法,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
一、回調(diào)的意義
在學(xué)習(xí)回調(diào)之前,我們需要知道使用回調(diào)的原因,和回調(diào)的應(yīng)用場景。
不如先思考兩個問題:
而在本例中,回調(diào)方式被用來處理爬取后的大量返回數(shù)據(jù)。在業(yè)務(wù)層面,這些數(shù)據(jù)被安排在調(diào)用方進行處理,但是調(diào)用方卻沒有處理這些數(shù)據(jù)的足夠權(quán)限。于是,通過回調(diào),業(yè)務(wù)被很好的分層并且執(zhí)行。
二、如何實現(xiàn)同步回調(diào)
本文對同步回調(diào)的業(yè)務(wù)需求如下:
根據(jù)需求可以得到回調(diào)過程的時序圖:
相應(yīng)代碼如下:
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)部類的方式
用 Java 實現(xiàn)同步回調(diào)有許多方式,為什么我們要通過匿名內(nèi)部類的方式來實現(xiàn)回調(diào),直接回調(diào)不香嗎?
不妨先看看直接回調(diào)的順序圖:
相應(yīng)代碼如下:
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è)務(wù)層面的設(shè)計上是絕對不允許的,而匿名內(nèi)部類在執(zhí)行回調(diào)等特定業(yè)務(wù)的同時,可以很好的對外隱藏用于回調(diào)的接口。
五、總結(jié)
常規(guī)類通常無法對回調(diào)等特定接口作出限定,要么都可以訪問,要么都拒絕訪問。而內(nèi)部類通過犧牲自身的被訪問權(quán)限,提升了自身訪問外部類的能力,這使得其成為實現(xiàn)回調(diào)的首選方案。在JAVA8中,lambda表達式本質(zhì)上就是匿名內(nèi)部類的語法糖。
注:匿名內(nèi)部類本質(zhì)上是成員內(nèi)部類、局部內(nèi)部類的簡化寫法,這里將其統(tǒng)稱為內(nèi)部類。
關(guān)于使用匿名內(nèi)部類實現(xiàn) Java 同步回調(diào)的方法就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(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)容。