Javaでのリスニングコールバックの実装について
1785 ワード
プログラミングでコールバックを使用してコードの自動呼び出しを実現することはよくあります.プログラミング初心者にとって、どのようにコールバックを実現するかは難しいように見えますが、実際にはコールバックの実現は非常に簡単です.まずコールバックの概念を理解し、wikiの定義を引用します.
コンピュータプログラム設計において、コールバック関数、またはコールバックと略称する(Callback、すなわちcall then backは、主関数によって演算が呼び出されると主関数に戻る)とは、関数パラメータを介して他のコードに渡され、ある実行可能なコードの参照を指す.この設計により、下位コードが上位レベルで定義されたサブルーチンを呼び出すことができる.
しかしJava言語には関数タイプのパラメータはなく、wikiも説明している.
関数タイプのパラメータが欠けているオブジェクト向けのプログラム言語、例えばJavaでは、コールバックは抽象クラスまたはインタフェースを渡すことでシミュレートできます.コールバックの受信者は、呼び出し元によって実装される抽象クラスまたはインタフェースのメソッドを呼び出します.このようなオブジェクトは、通常、コールバック関数の集合であり、必要なデータが含まれる可能性があります.この方法は,アクセス者モード,オブザーバモード,ポリシーモードなど,いくつかの設計モードを実現する際に比較的有用である.
次に、ファイルのダウンロードを例に、ファイルのダウンロードが完了したコールバック関数を書きます.まず、インタフェースを書きます.このインタフェースでは、ダウンロードを完了するコールバック方法
コンピュータプログラム設計において、コールバック関数、またはコールバックと略称する(Callback、すなわちcall then backは、主関数によって演算が呼び出されると主関数に戻る)とは、関数パラメータを介して他のコードに渡され、ある実行可能なコードの参照を指す.この設計により、下位コードが上位レベルで定義されたサブルーチンを呼び出すことができる.
しかしJava言語には関数タイプのパラメータはなく、wikiも説明している.
関数タイプのパラメータが欠けているオブジェクト向けのプログラム言語、例えばJavaでは、コールバックは抽象クラスまたはインタフェースを渡すことでシミュレートできます.コールバックの受信者は、呼び出し元によって実装される抽象クラスまたはインタフェースのメソッドを呼び出します.このようなオブジェクトは、通常、コールバック関数の集合であり、必要なデータが含まれる可能性があります.この方法は,アクセス者モード,オブザーバモード,ポリシーモードなど,いくつかの設計モードを実現する際に比較的有用である.
次に、ファイルのダウンロードを例に、ファイルのダウンロードが完了したコールバック関数を書きます.まず、インタフェースを書きます.このインタフェースでは、ダウンロードを完了するコールバック方法
interface DownLoadListener{ onDownLoadComplete(); }
を書きます.その後、ファイルダウンロードモジュールにリスナーを設定する方法を書きます.他の人が実装したDownLoadListenerをDownLoadFilesに所有しているDownLoadListenerオブジェクトClass DownLoadFiles{ // DownLoadListener mListener; // DownLoadListener void setDownLoadListener(DownLoadListener listener){ mListener = listener; } }
に設定します.ファイルダウンロードが完了したときにlistenerのonDownLoadCompleteを呼び出すだけです.方法は良いClass DownLoadFiles{ // DownLoadListener mListener; // DownLoadListener public void setDownLoadListener(DownLoadListener listener){ mListener = listener; } downLoad(){ ...... if(downLoadfinish){ listener.onDownLoadComplete(); } ...... } }
このコールバックを使うのもとても簡単ですclass MyClass{ Function(){ DownLoadFiles downLoad = new DownLoadFiles(); downLoad.setDownLoadListener( new DownLoadListener(){ onDownLoadComplete(){ // ...... } } ); } }
参考とおすすめ読書https://zh.wikipedia.org/wiki/%E5%9B%9E%E8%B0%83%E5%87%BD%E6%95%B0 https://www.zhihu.com/question/19801131