1.はじめに
コンピュータプログラミング、にコールバック関数と呼ばれるコールバック(コールバック)は、機能コードパラメータによって渡された他の参考文献、実行可能コードの断片を指します。この設計は、サブルーチンレベルの定義を呼び出すための基礎となるコードすることができます。
これらは、「コールバック関数」のWikipediaの定義です。コールバックのために、異なる言語には、例えば、異なるコールバックを持っています:
- C、C ++は、関数ポインタがパラメータとして渡されることができ。
- JavaScriptは、Pythonは、パラメータとして関数名を許可します。
この記事では、Javaコールバックで書かれた4種類をご紹介します。
- リフレクション;
- ダイレクトコール;
- インターフェイスは、呼び出します。
- ラムダ式。
開始する前に、まずここでは、主な機能は、我々は非同期要求を送信するコード例のコンテキストで導入され、コールバック関数の指定方法に応じて、主な機能は、他のことを行うと、応答が到着したときに、コールバック関数が実行されます。
2.リフレクター
Javaのリフレクション・メカニズムは、私たちはクラスメソッドを含むクラスに関する情報を取得することができます。私たちは、その要求が関数に渡され、コールバック関数メソッドの型を取得するために行くだろう。例としては、次のとおりです:
要求クラス送信方法は、2つのパラメータclazz、方法があり、方法のパラメータは、コールバック関数がコールによって反射され渡され、メソッドを呼び出すためにしようとするタイプのクラスメソッドタイプのものであっただけでなく、例えば、それがあろうコールバック関数は、パラメータとしてのnewInstanceによってコール呼び出し反射パスを構築したオブジェクトが渡さクラスオブジェクトクラス。
public class Request{
public void send(Class clazz, Method method) throws Exception {
// 模拟等待响应
Thread.sleep(3000);
System.out.println("[Request]:收到响应");
method.invoke(clazz.newInstance());
}
}
复制代码
コールバック・クラスは、コールバック関数、治療応答と同様に、非常に単純な、およびのみprocessResponse方法です。
public class CallBack {
public void processResponse() {
System.out.println("[CallBack]:处理响应");
}
}
复制代码
私たちは、リクエストを送信するために新しいスレッドを開くmainメソッド、および内部に合格する必要CallBack.classとprocessResponseの方法です。
public class Main {
public static void main(String[] args) throws Exception {
Request request = new Request();
System.out.println("[Main]:我开个线程去异步发请求");
new Thread(() -> {
try {
request.send(CallBack.class, CallBack.class.getMethod("processResponse"));
} catch (Exception e) {
e.printStackTrace();
}
}).start();
System.out.println("[Main]:请求发完了,我去干点别的");
Thread.sleep(100000);
}
}
/** Output:
[Main]:我开个线程去异步发请求
[Main]:请求发完了,我去干点别的
[Request]:收到响应
[CallBack]:处理响应
*/
复制代码
言葉遣いが非常に複雑になっているパラメータを渡す必要があり、それが推奨されていません。ここでは、簡単なダイレクトコールの書き込みです。
3.ダイレクトコール
のは、sendメソッドの代わりにコールバック型パラメータのパラメータを書き換えてみましょう。次のとおりです。
sendメソッドでは、オブジェクトを介して直接するinvokeメソッドにリフレクションを使用しないでください。
public class Request{
public void send(CallBack callBack) throws Exception {
// 模拟等待响应
Thread.sleep(3000);
System.out.println("[Request]:收到响应");
callBack.processResponse();
}
}
复制代码
主な機能は、我々は新しいコールバックオブジェクトはsendメソッドにパラメータとして渡されています。
public class Main {
public static void main(String[] args) throws Exception {
Request request = new Request();
System.out.println("[Main]:我开个线程去异步发请求");
CallBack callBack = new CallBack();
new Thread(() -> {
try {
request.send(callBack);
} catch (Exception e) {
e.printStackTrace();
}
}).start();
System.out.println("[Main]:请求发完了,我去干点别的");
Thread.sleep(100000);
}
}
复制代码
この実装は非常に単純ですが、問題がクローズ変更の原則に沿ったものではありません。私たちは「処理応答」方法を変更したい場合には、のprocessRequest()メソッドコールバッククラスを変更する必要がありますされています。コールバッククラスがインタフェースを変更した場合、我々は、コールバックの唯一の実現を置き換えることができます。以下の文言インターフェースは、ルックを呼び出します。
4.インタフェース呼び出し
ファーストクラスのコールバックは、インターフェイスを変更しました。
public interface CallBack {
public void processResponse();
}
复制代码
そして、実装のcallbackImplコールバックインタフェースというクラスを追加します。
public class CallBackImpl implements CallBack {
@Override
public void processResponse() {
System.out.println("[CallBack]:处理响应");
}
}
复制代码
Requestクラス変わりません。メインクラスのメインメソッドでのcallbackImplをインスタンス化し、その後、コールバックインタフェースに通過します。
public class Main {
public static void main(String[] args) throws Exception {
Request request = new Request();
System.out.println("[Main]:我开个线程去异步发请求");
CallBack callBack = new CallBackImpl();
new Thread(() -> {
try {
request.send(callBack);
} catch (Exception e) {
e.printStackTrace();
}
}).start();
System.out.println("[Main]:请求发完了,我去干点别的");
Thread.sleep(100000);
}
}
复制代码
5.ラムダ式
これらのメソッドは、すでにほとんど導入され、そして最終的に我々は、ラムダ式を使用することによって、あなたはクラス以下を実装するコールバックインタフェースを追加する必要はありませんが、より簡潔な表現を紹介します。書き換えられた主な方法は以下を参照してください。
public class Main {
public static void main(String[] args) throws Exception {
Request request = new Request();
System.out.println("[Main]:我开个线程去异步发请求");
new Thread(() -> {
try {
request.send(()-> System.out.println("[CallBack]:处理响应"));
} catch (Exception e) {
e.printStackTrace();
}
}).start();
System.out.println("[Main]:请求发完了,我去干点别的");
Thread.sleep(100000);
}
}
复制代码
私たちは、コールバックを完了することができますラムダ式を渡す必要があり、インスタンス化とらない、新しい実装クラスを取ることはありません。
6.まとめ
あなたのコールバックのより良い理解を与えるために、紙は執筆の4種類の合計を説明し、反射に加えて、他の3つは、自己作成した彼らのニーズに応じている、お勧めしません。
記事のジュニアパートナーのような私は、あなたは国民の関心は私のコード番号の下に掃引することができます:「草の子ピンチ」