Javaコールバック関数の理解

4067 ワード

コールバックとは、クライアントプログラムCがサービスプログラムSのある関数Aを呼び出し、Sがあるときに逆にCのある関数Bを呼び出すことであり、Cにとって、このBをコールバック関数と呼ぶ.例えばWin 32のウィンドウプロセス関数は典型的なコールバック関数である.一般に、Cは自分でBを呼び出すことはなく、CがBを提供する目的はSを呼び出すことであり、Cが提供せざるを得ない.SはCが提供するBの名前が誰なのか分からないので、SはBのインタフェース仕様(関数プロトタイプ)を約束し、Cが事前にSの関数Rを通じてS自身にB関数を使用することを伝え、このプロセスをコールバック関数の登録と呼び、Rを登録関数と呼ぶ.WebサービスおよびJavaのRMIはコールバックメカニズムを用いており,リモートサーバプログラムにアクセスできる.
次は通俗的な例を挙げます:ある日、私は電話をかけてあなたに質問を教えて、もちろん難題です^^、あなたはすぐに解決方法が思いつかないで、私はまた電話を持ってそこで馬鹿に待つことができなくて、そこで私たちは約束しました:あなたが方法を考えてから携帯電話で私に知らせて、このようにして、私は電話を切って他のことをしました.XX分を过ぎて、私の携帯は鸣って、あなたは喜んで问题がすでに解决したと言って、このように処理するべきです.物語はこれで終わります.この例では、「非同期+コールバック」のプログラミングモードを説明します.その中で、あなたは後で携帯電話で私に結果が「コールバック」の過程であることを教えてくれました.私の携帯番号は前に教えなければなりません.これはコールバック関数を登録します.私の携帯電話番号は有効で、携帯電話はあなたのコールを受信することができます.これはコールバック関数であり、インタフェースの規範に合致しなければなりません.
 
上記の個人的な感覚を通じて、コールバックのより多くの応用は非同期を結合することである.たとえば、Ajaxのjsは、コンポーネントとサーバのひどうきつうしんを介しています.
 
 
例:
プログラマAは、コールバック関数インタフェースを予め残し、プログラムをカプセル化するプログラム(プログラムa)を書いた.プログラマBは、aに自分のプログラムbの1つの方法を呼び出すようにし、aのインタフェースを介して自分のbの方法をコールバックする.目的が達する.C/C++では、コールバック関数を使うには、落とされた関数は呼び出し者に自分のポインタアドレスを教える必要がありますが、JAVAにはポインタがありません.どうすればいいですか?インタフェース(interface)によってコールバック関数を定義することができます.私がプログラマーAだとしたら、以下は私のプログラムaです.
 
 
public class Caller { public MyCallInterface mc; public void setCallfuc(MyCallInterface mc) { this.mc= mc; } public void call(){ this.mc.method(); } } 

 
 
 
 
プログラマBが私の定義プログラミングに従ってインタフェースを実装するために、インタフェースを定義する必要があります.
 
public interface MyCallInterface { public void method(); } 

 
 
すると、プログラマBは、このインタフェースを実現するだけでコールバックの目的を達成することができます.
 
public class B implements MyCallInterface { public void method() { System.out.println("  "); } public static void main(String args[]) { Caller call = new Caller(); call.setCallfuc(new B()); call.call(); } } 

ソース:http://blog.csdn.net/fengyifei11228/article/details/5729445