JAvaコールバック関数

5184 ワード

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

 2 {

 3     public MyCallInterface mc;

 4 

 5     public void setCallfuc(MyCallInterface mc)

 6     {

 7        this.mc= mc;

 8     }

 9 

10     public void call(){

11        this.mc.method();

12     }

13 }

プログラマCが私の定義に基づいてプログラムを記述してインタフェースを実現するために、インタフェースを定義する必要があります.
  
1 public interface CallInterface

2  {

3      public void method();

4  

5  }

すると、プログラマーCは、このインタフェースを実現するだけでコールバックの目的を達成することができます.
 1 public class C implements CallInterface

 2 {

 3     public void method()

 4     {

 5        System.out.println("  ");

 6     }

 7 

 8     public static void main(String args[])

 9     {

10        Caller call = new Caller();

11        call.setCallfuc(new B());

12        call.call();

13     }

14 }