1。はじめに
多くのプログラミング言語では、関数コールバックの概念が存在します。 CおよびC ++には関数ポインターがあるため、後の呼び出しのために他の関数にパラメーターとして関数を渡すことができます。 JavaScriptでは、関数コールバックが極端になります。さまざまなイベント、特に非同期イベントの処理は、基本的に機能コールバックによって完了します。
Javaでは、機能コールバックも実装できます。関数ポインターはありませんが、Javaは反射メカニズムを介してクラスメソッドを取得できます。タイプjava.lang.reft.methodのパラメーターとして他の関数に渡し、メソッドオブジェクトのInvokeメソッドを介して関数を呼び出します。
それにもかかわらず、この方法での呼び出しステップは比較的面倒で、実行が非効率的であり、デバッグが困難です。 Javaには、関数コールバック、つまりインターフェイスよりもエレガントなメカニズムがあります。
2。なぜ機能コールバックが必要なのか
関数コールバックは、実際には特定の関数の実装を遅らせる方法です。
プログラムがどのような操作を実行するかを事前に知っていれば、機能コールバックの必要はまったくなく、プログラミング中に直接実装できます。
しかし、多くの場合、特にツールクラス、関数ライブラリ、またはフレームワークを作成する場合、コードを作成する場合、比較的一般的な関数と抽象的な関数が実装され、特定のシナリオの関数はこれらのクラスを使用して開発者によって実装されます。
関数コールバックは、特定の実装が事前にわからないこの状況を解決できます。
ソート機能の例
たとえば、一般的なソート関数を実装したい場合、他の開発者がソートに使用する要素の種類を事前に知りません。これらの要素の部分順序(サイズ)関係を判断する基準はわかりません。
したがって、他の開発者は、ソート関数を使用するときに比較関数を提供する必要があります。そのため、要素の種類を事前に把握せずにソートする要素のサイズを比較して比較することも、比較の特定の実装も比較できます。
ここで、比較関数はソート機能のコールバック関数です。
擬似コードは次のように表されます。
//一般的な並べ替えvoidソート(オブジェクト[] array、メソッド比較){//比較関数を使用して配列の要素のサイズ関係を比較します//配列のソート}非同期処理機能の例
たとえば、非同期処理機能を記述する場合、特定のシナリオで関数を使用する場合にのみこれらの操作がわかるため、処理が完了したときに他の開発者が何をすべきかを事前に知りません。
したがって、開発者は、この関数を使用するときにコールバック関数コールバックを提供する必要があります。このようにして、非同期処理機能を記述すると、コールバック関数を呼び出して、これらの最終作業が事前に何であるかを知らずに最終作業を実行できます。
擬似コードは次のように表されます。
// async処理関数void asynprocess(メソッドコールバック){//非同期タスクコールバック();} //特定のコールバック関数void callback()は、非同期処理が完了した後に実行される発信者{//操作によって実装されます}}}3.関数コールバックの代わりにインターフェイスを使用します
上記で、機能コールバックが使用される理由は、特定の機能の特定の実装が事前にわからないため、特定の実装が他の開発者に完了するために任されているためです。
この文はJavaインターフェイスを説明しているようだと思いますか?インターフェイスは、一連のメソッドの抽象的な定義であり、特定の実装は、インターフェイスを実装するクラスによって完了します。
したがって、オブジェクト指向およびインターフェイス指向の2つの特性を使用して、関数コールバックを置き換えることができます。
上記の2つの例を示して、インターフェイスが関数コールバックをどのように置き換えるかを示します。
関数をソートします
インターフェイスを使用してソート関数を実装すると、開発者はソート機能を使用するときにコールバック関数比較を提供する必要がなくなりますが、ソートされる要素が同等のインターフェイスを実装することを確実にする必要があります。 「ソートされる要素が既に同等のインターフェイスを実装している」という前提に基づいて、ソートされる要素のタイプを知らずにソート関数を実装できます。
//汎用関数void sort(object [] array){//比較可能なインターフェイス比較方法を使用します//要素のサイズを比較して配列を並べ替えます。 } //関数の並べ替えによって定義されたインターフェースpublic interface camparable {public int compareto(object other);} //比較可能なインターフェイスパブリッククラスの要素を実装します{@override public int compareto(Object other){//要素とその他の現在のサイズの関係を判断し、2つの間の関係を返す}}}}非同期処理機能
インターフェイスを使用して非同期処理機能を実装する場合、開発者はコールバック関数コールバックを必要としませんが、Javaオブジェクト指向のアイデアをよく反映する指定されたインターフェイスを実装するオブジェクトを必要とします。関数を提供するのと比較して、オブジェクトにはより多くの情報が含まれており、より柔軟に使用できます。しかし、本質的に、この非同期処理関数は依然としてインターフェイスを使用して仕上げ作業を完了します。
// async処理関数void asynprocess(actionlistener al){//非同期タスクを実行するal.actionperformed();} //非同期処理関数パブリックインターフェイスactionlistener {void actionperformed(} // actionlistener interface interface public extratisk extratisk extratederrest explention explention explence ActionPerformed(){//非同期処理機能が完了したときに必要な追加作業}} //非同期処理関数public static void main(string [] args){asynprocess(new extratask());}4。概要
コールバックメソッドは、次のように要約できます。一般的な関数FUNCの実装。特定のシナリオでこの一般的な関数を呼び出すとき、発信者は適切なコールバック関数コールバックを提供する必要があります。一般的な関数FUNCは、このコールバック関数を使用して、特定のシナリオでタスクを完了します。
インターフェイスを実装する方法は、一般的な関数FUNCを実装することです。特定のシナリオでこの一般的な関数を呼び出す場合、操作されているオブジェクトは、それ自体で適切なインターフェイスを実装する必要があります。一般的な関数は、このインターフェイスを使用して、特定のシナリオでタスクを完了します。
関数コールバックまたはインターフェイスを使用すると、特定の実装が事前にわからない状況を解決できます。関数コールバックメソッドは関数を渡し、インターフェイスメソッドはインターフェイスを実装するオブジェクトを渡します。
Javaでは、反射メカニズムを使用して機能コールバックを完了する必要があります。これは、エラーが発生しやすく、非効率的です。インターフェイスを使用すると、コードのロジックがより明確になり、効率的で、デバッグが簡単になります。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。