モジュール間にこれらの特定のインターフェイスが常にあります。呼び出し方法の観点から、それらは同期呼び出し、コールバック、非同期コールの3つのカテゴリに分けることができます。以下は、コールバックメカニズムの詳細を詳細に説明することに焦点を当てています。
1。概要
Javaのコールバックメカニズムは比較的一般的なメカニズムですが、プログラムではあまり使用されておらず、コールバックメカニズムはいくつかの大きなフレームワークのどこでも見ることができます。この記事では、いくつかの特定の例を使用して、Javaのコールバックメカニズムにゆっくりと近づきます。
2。コールバック
いわゆるコールバック:クラスBのクラスAのメソッドCを呼び出し、クラスBのクラスAのクラスAのメソッドDを呼び出すことを意味します。この方法Dは、コールバックメソッドと呼ばれます。実際に使用すると、次のようなコールバックフォームが異なります。
2.1同期コールバック
ここで私はそのような状況を想定しています。
A社のディレクターBは、彼の部下(プロジェクトマネージャーC)に調査をやりたいと語ったが、Cは自分でそれをする必要はなかった。マネージャーCは、プログラマーDがそれを完了するように手配するように求められます。マネージャーCはプログラマーDを見つけて、研究タスクが完了することを彼に言った。マネージャーに調査の結果を伝えます。問題がある場合でも、継続する必要があります。ここにはdに何かをするように頼むことがあるので、Dはまだ結果をCと通信する必要があります。これがコールバックモデルです。以下は、一般的なコールバッククラス図です。
まず、コールバックインターフェイスCallBackInterfaceが必要です
callbackinterface.java
パブリックインターフェイスCallBackInterface {public boolean check(int result);}バックグラウンドでは、プログラマーDはプロジェクトマネージャーCと結果を伝えたいと考えているため、プロジェクトマネージャーは上記のコールバックインターフェイスを実装する必要があります。
Manager.java
パブリッククラスマネージャーは、callbackinterface {プライベートプログラマプログラマー= null;パブリックマネージャー(プログラマー_programmer){this.programmer = _programmer; } / ***ボスが発行した代表団に使用* / public void entrust(){andortion(); } //従属をスケジュールして、private void arrange(){system.out.println( "マネージャーがプログラマーの作業を手配している"); programmer.study(manager.this); System.out.println(「プログラマーの作業スケジュールが完了し、マネージャーは他のことを行うために行っています。」); } @Override public boolean check(int result){if(result == 5){return true; } falseを返します。 }}プログラマーDの場合、彼は彼とコミュニケーションをとるためにマネージャーCからの見積もりを保持する必要があります。ただし、BがマネージャーCに手配するように依頼したタスクは次のとおりです。言い換えれば、マネージャーB1、B2などなど、他のマネージャーにも尋ねることができます。マネージャーはコールバックインターフェイスを実装しているため、プログラマーDにこのインターフェイスを直接保持することができます。次のように:
programmer.java
パブリッククラスプログラマ{public void Study(callbackinterface callback){int result = 0; {result ++; System.out.println( "th" + result + "研究の結果"); } while(!callback.check(result)); System.out.println( "調査タスクの終了"); }}これはクライアントのテストに相当するため、ディレクターにとってはさらに簡単で明確です。
Boss.java
public class Boss {public static void main(string [] args){Manager Manager = new Manager(new Programmer()); Manager.Entrust(); }}実行結果:
マネージャーはプログラマー向けの作業を手配しています。最初の研究の結果。第2研究の結果。第3研究の結果。第4研究の結果。第5研究の結果。第5研究。プログラマーのスケジューリング作業が完了しました。マネージャーは他のことをしました。
2.2非同期コールバック
上記の例に関しては、プロジェクトマネージャーは常にあなたの研究の結果を待つことはできません。しかし、あなたがこのタスクをあなたに渡した後、彼はそれを無視します。彼は彼自身のことをします、あなたはあなた自身のことをします。したがって、ここでコールバック関数を非同期に処理する必要があります。
したがって、ここでは、プログラマークラスのコードを変更し、次のように変更する必要があります。
programmer.java
Public Class Programmer {public Programmer(){} public void Study(callbackinterface callback){new StudyThread(callback).start(); } // ------------------------プログラマー正在做的工作-----------------------クラスStudyThread extendsスレッド{callbackinterface callback = null; public StudyThread(callbackinterface _callback){callback = _callback; } @Override public void run(){int result = 0; {result ++; System.out.println( "th" + result + "研究の結果"); } while(!callback.check(result)); System.out.println( "調査タスクの終了"); }}}実行結果:
マネージャーはプログラマーのスケジューリング作業であり、プログラマーのスケジューリング作業が完了しており、マネージャーは他のことを行っています。
第1回研究結果の結果の結果、第5回研究結果の第4研究結果の第3研究結果の結果は、研究タスクが終了した
2.3閉鎖とコールバック
閉鎖は、作成された範囲からいくつかの情報を記録する呼び出し可能なオブジェクトです。
2.3.1通常の呼び出し
まず、通常の状況下でコールがどのように行われるかを見ることができます。
Incrementable.java
インターフェイス増分{void increment();}これは通常のインターフェイスです(通常の呼び出しの通常のインターフェイスであり、コールバックのコールバックインターフェイスであり、理解しやすいはずです)。
Callee1.java
クラスCallee1はインクリメンタ可能な{private int i = 0; @Override public void increment(){i ++; System.out.println(i); }}callbacks.java
パブリッククラスのコールバック{public static void main(string [] args){callee1 callee1 = new callee1(); callee1.increment(); }}コールバックはテストクライアントクラスであり、上記のコードを見てください。
2.3.2コールバック初期トライアル
通常のJavaプログラマーにとっては、これは考えなくてもできることであるべきだからです。
コールバックを形成したい場合、プログラムの構造またはロジックに関して1つのCallee(コールバックオブジェクトCallee1)のみを持つことは不可能です。また、発信者オブジェクトも必要です。発信者は次のように書くことができます:
caller.java
クラスCaller {private incrementable callbackReference; public caller(incrementable _callbackreference){callbackreference = _callbackreference; } void go(){callbackreference.increment(); }}ここで、Callerは、上記のプログラマーがプロジェクトマネージャーのリファレンスを保持する必要があるように、このリファレンスを通じてプロジェクトマネージャーと通信できるように、コールバックインターフェイスのコールバックリファレンスを保持しています。ここのコールバックリファレンスもこの役割を果たしています。
それでは、テストクラスの執筆を見てみましょう。
callbacks.java
パブリッククラスのコールバック{public static void main(string [] args){callee1 callee1 = new callee1();発信者caller1 = new Caller(callee1); caller1.go(); }}これまでのプログラムコードについては、プロジェクトマネージャーがプログラマーを配置して技術的な問題を調査するコードを完全に比較できます。同じ効果があります。
2.3.3閉鎖コールバック
通常のコールバックと比較して、閉鎖コールバックのコアは自然に閉鎖に横たわっています。つまり、スコープを制御します。
ここで、ユーザー(他のプログラマ)がmyincrementクラスをカスタマイズし、増分方法を含むとします。次のように:
class myincrement {public void increment(){system.out.println( "mycrement.increment"); } static void f(myincrement increment){increment.increment(); }}上記のクラスから継承された別のクラスCallee2があります。
クラスCallee2はmyincrementを拡張します{private int i = 0; public void increment(){super.increment(); i ++; System.out.println(i); }}ここでincrement()メソッドを呼び出したい場合、一般的な関数呼び出しになることは明らかです。したがって、ここでは、上記のCallee2クラスを変更する必要があります。変更の目標は、Callee2クラスをmyincrementクラスのincrement()メソッドと増分の増分()メソッドと互換性のあるものにすることです。変更後:
クラスCallee2はmyincrementを拡張します{private int i = 0; public void increment(){super.increment(); i ++; System.out.println(i); }プライベートクラスの閉鎖は、Incrementable {@Override public void increment(){callee2.this.increment(); }} incrementable getCallBackReference(){return new closure(); }}ここの閉鎖クラスはプライベートクラスであり、閉鎖の要素であることに注意してください。閉鎖クラスはプライベートであるため、閉鎖オブジェクトの操作のためのオープンインターフェイスが必要です。これは、上記のgetCallBackReference()メソッドです。発信者クラスは変更されていません。
クライアントをテストするには、コードをご覧ください。
パブリッククラスのコールバック{public static void main(string [] args){callee2 callee2 = new callee2();発信者Caller2 = new Caller(callee2.getCallbackReference()); caller2.go(); }}上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。