ホームページ >Java >&#&チュートリアル >匿名クラスを使用して Java でコールバック関数を実装する例の説明

匿名クラスを使用して Java でコールバック関数を実装する例の説明

黄舟
黄舟オリジナル
2017-08-22 10:10:451617ブラウズ

この記事では、Java が匿名クラスを介してコールバック関数を実装する例を主に紹介します。コールバック関数は、関数シグネチャ (複数の入力パラメータ、1 つの出力パラメータ) の仕様です。規制を施行する。具体的な操作手順については、以下の詳細な説明を確認して、興味のある友人は参照してください。

C言語では、関数名を関数ポインタとして仮パラメータに渡してコールバックを実装できます


void f1() { printf("f1()\n"); }
void f2() { printf("f2()\n"); }
void f3() { printf("f3()\n"); }
void do_func(void(*f)()) { f(); }
int main()
{
  do_func(f1);
  do_func(f2);
  do_func(f3);
}

C++11では、コールバックは関数テンプレートとラムダ式を通じて実装することもできます


template <typename Func>
void do_func(Func f) { f(); }
int main()
{
  do_func([]() { printf("f1()"); });
  do_func([]() { printf("f2()"); });
  do_func([]() { printf("f3()"); });
}

Ifコールバック関数のコード実装は比較的複雑で、再利用の価値があるため、ラムダ式などの 1 回限りのソリューションは適切ではありません。C++11 より前では、関数オブジェクトを通じて実装されていました。率直に言うと、関数オブジェクトはクラスの通常のオブジェクトですが、C++ では括弧演算子をオーバーロードできるため、クラスのオブジェクトの Operator() メソッドの呼び出しは関数を呼び出すのと同じくらい自然です。

本質を分析すると、実際、コールバック関数は関数シグネチャ (複数の入力パラメーター、1 つの出力パラメーター) の仕様です。Java には関数宣言がありませんが、インターフェイスを使用して仕様を強制できます。


interface Funcable {
  void Func();
}

このように、インターフェイスを実装するクラスが void Func() と同じ関数シグネチャを持つメンバー関数を持っている限り (まあ、まだ name メソッドに慣れていないので)、それを実装する必要があります このインターフェースを持つクラスのオブジェクトを関数に渡し、関数内でオブジェクトの Func() メソッドを呼び出します


class F1 implements Funcable {

  @Override
  public void Func() {
    System.out.println("f1()");
  } 
}
public class Test {
  
  public static void do_func(Funcable funcable) {
    funcable.Func();
  } 
  public static void main(String[] args) {
    do_func(new F1());
  }
}

ここでコード量を節約するために、クラス F2 と F3 は次のようにします。書かれないこと。また、Java の匿名クラスを使用すると、ラムダ式と同様にコードを保存できます


  do_func(new Funcable() {      
      @Override
      public void Func() {
        System.out.println("f2()");
      }
    });

ラムダ式と言えば、Java では、この方法は匿名コンストラクターを介して実行することもできます。外部変数を明示的にキャプチャします


  String msg = "f3()";
    do_func(new Funcable() {
      String _msg; 
      {
        _msg = msg;
      } 
      @Override
      public void Func() {
        System.out.println(_msg);
      }
    });

このアプローチはラムダ式に非常によく似ています。匿名クラスの匿名コンストラクターは構築パラメータとして外部変数のみを使用できるため、ラムダ式の「キャプチャ」に相当します。C++ でのラムダ式の対応する記述方法は次のとおりです。


 std::string msg = "f3()";
  do_func([&msg]() { std::cout << msg << std::endl; });

java8にもラムダ式があるので、このように書くこともできます

do_func(() -> { System.out.println(msg); });

以上が匿名クラスを使用して Java でコールバック関数を実装する例の説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。