日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Java進(jìn)階:用匿名內(nèi)部類實(shí)現(xiàn)Java同步回調(diào)

在一個(gè)應(yīng)用系統(tǒng)中,不論使用何種編程語(yǔ)言,模塊之間要進(jìn)行調(diào)用,僅存在三種方式:同步調(diào)用、異步調(diào)用、回調(diào)。本文就其中回調(diào)方式進(jìn)行詳細(xì)解讀,并通過(guò)匿名內(nèi)部類的手段,在最后實(shí)現(xiàn)一個(gè)同步回調(diào)的過(guò)程。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:申請(qǐng)域名、虛擬空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、南木林網(wǎng)站維護(hù)、網(wǎng)站推廣。

一、回調(diào)的意義

在學(xué)習(xí)回調(diào)之前,我們需要知道使用回調(diào)的原因,和回調(diào)的應(yīng)用場(chǎng)景。

不如先思考兩個(gè)問(wèn)題:

  • 棧底對(duì)棧頂通常是不可見(jiàn)的,但是棧頂有時(shí)需要直接調(diào)用棧底
  • 上級(jí)派下級(jí)做事,在此期間,下級(jí)可能需要通過(guò)上級(jí)獲取高權(quán)限的協(xié)助

而在本例中,回調(diào)方式被用來(lái)處理爬取后的大量返回?cái)?shù)據(jù)。在業(yè)務(wù)層面,這些數(shù)據(jù)被安排在調(diào)用方進(jìn)行處理,但是調(diào)用方卻沒(méi)有處理這些數(shù)據(jù)的足夠權(quán)限。于是,通過(guò)回調(diào),業(yè)務(wù)被很好的分層并且執(zhí)行。

二、如何實(shí)現(xiàn)同步回調(diào)

本文對(duì)同步回調(diào)的業(yè)務(wù)需求如下:

  • 回調(diào)方調(diào)用調(diào)用方進(jìn)行數(shù)據(jù)爬取
  • 調(diào)用方調(diào)用回調(diào)方進(jìn)行數(shù)據(jù)存儲(chǔ)
  • 調(diào)用方調(diào)用回調(diào)方進(jìn)行日志記錄

根據(jù)需求可以得到回調(diào)過(guò)程的時(shí)序圖:

相應(yīng)代碼如下:

 
 
 
 
  1. public interface Handler { 
  2.     void handle(String info); 
  3.  
  4. public class Task { 
  5.     private String info; 
  6.  
  7.     private void setInfo(String info) { 
  8.         this.info = info; 
  9.     } 
  10.  
  11.     public void call() { 
  12.         Crawler.getInstance().crawl(new Handler() { 
  13.             @Override 
  14.             public void handle(String info) { 
  15.                 setInfo(info); 
  16.             } 
  17.         }); 
  18.     } 
  19.  
  20. public class Crawler { 
  21.     private static Crawler instance = null; 
  22.  
  23.     public static Crawler getInstance() { 
  24.         if (instance == null) { 
  25.             instance = new Crawler(); 
  26.         } 
  27.         return instance; 
  28.     } 
  29.  
  30.     private String getInfo() { 
  31.         return "the info from crawler"; 
  32.     } 
  33.  
  34.     public void crawl(Handler handler) { 
  35.         handler.handle(getInfo()); 
  36.     } 

三、遇到的問(wèn)題

如果我們使用代碼來(lái)實(shí)現(xiàn)上述回調(diào)過(guò)程,不難會(huì)發(fā)現(xiàn)這樣一個(gè)問(wèn)題:Task調(diào)用Crawler,Crawler調(diào)用Handler,Hanlder調(diào)用Task。很明顯,此處存在一個(gè)環(huán),產(chǎn)生了循環(huán)依賴的問(wèn)題,而接口可以為我們提供良好的解決方案。

四、為什么通過(guò)匿名內(nèi)部類的方式

用 Java 實(shí)現(xiàn)同步回調(diào)有許多方式,為什么我們要通過(guò)匿名內(nèi)部類的方式來(lái)實(shí)現(xiàn)回調(diào),直接回調(diào)不香嗎?

不妨先看看直接回調(diào)的順序圖:

相應(yīng)代碼如下:

 
 
 
 
  1. public interface Handler { 
  2.     void handle(String info); 
  3.  
  4. public class Task implements Handler{ 
  5.     private String info; 
  6.  
  7.     private void setInfo(String info) { 
  8.         this.info = info; 
  9.     } 
  10.  
  11.     public void call() { 
  12.         Crawler.getInstance().crawl(this); 
  13.     } 
  14.  
  15.     @Override 
  16.     public void handle(String info) { 
  17.         setInfo(info); 
  18.     } 
  19.  
  20. public class Crawler { 
  21.     private static Crawler instance = null; 
  22.  
  23.     public static Crawler getInstance() { 
  24.         if (instance == null) { 
  25.             instance = new Crawler(); 
  26.         } 
  27.         return instance; 
  28.     } 
  29.  
  30.     private String getInfo() { 
  31.         return "the info from crawler"; 
  32.     } 
  33.  
  34.     public void crawl(Handler handler) { 
  35.         handler.handle(getInfo()); 
  36.     } 

直接回調(diào)帶來(lái)的最大問(wèn)題便是回調(diào)接口的暴露,也就是說(shuō)回調(diào)接口不一定用于回調(diào),也可以用于直接訪問(wèn)。這在業(yè)務(wù)層面的設(shè)計(jì)上是絕對(duì)不允許的,而匿名內(nèi)部類在執(zhí)行回調(diào)等特定業(yè)務(wù)的同時(shí),可以很好的對(duì)外隱藏用于回調(diào)的接口。

五、總結(jié)

  • 常規(guī)類不保證接口安全性:常規(guī)接口通??梢栽O(shè)定權(quán)限,但不可以指定訪問(wèn)類,也就是說(shuō)要么都可以訪問(wèn),要么都拒絕訪問(wèn)。而內(nèi)部類中接口可以指定訪問(wèn)類。
  • 內(nèi)部類保證接口安全性:內(nèi)部類接口通常是對(duì)外隱藏的,那么如何使得內(nèi)部類對(duì)指定訪問(wèn)類暴露呢?方法很簡(jiǎn)單,只需要通過(guò)外部類實(shí)例化內(nèi)部類,并對(duì)指定類傳參,便可以使得指定類對(duì)內(nèi)部類可訪問(wèn)。
  • 內(nèi)部類的安全性加上其對(duì)外部類的完全權(quán)限,這使得其成為實(shí)現(xiàn)回調(diào)的首選方案。在JAVA8中,lambda表達(dá)式本質(zhì)上就是匿名內(nèi)部類的語(yǔ)法糖。

注:匿名內(nèi)部類本質(zhì)上是成員內(nèi)部類、局部?jī)?nèi)部類的簡(jiǎn)化寫法,這里將其統(tǒng)稱為內(nèi)部類。


文章名稱:Java進(jìn)階:用匿名內(nèi)部類實(shí)現(xiàn)Java同步回調(diào)
鏈接分享:http://www.5511xx.com/article/coihpio.html