1

こんにちは、Javaで関数ポインタを実装することは可能ですか?私はこのようなことをしようとしています

void methodA
{
  try
   {
   }
  catch(Exception E)
   {
    methodB(Pass the function pointer pointing to methodA)
   }
}

void methodB(fp some_function_pointer)
{
   call some_function_pointer
}
4

4 に答える 4

4

いいえ。ただし、オブジェクト自体を渡すことができます。

public class Foo {
    void methodA() {
        try {
        }
        catch(Exception e) {
            bar.methodB(this)
        }
    } 
}

public class Bar {
    void methodB(Foo someFoo) {
        someFoo.methodA();
    } 
}

任意のメソッドを渡すことができるようにする場合は、このメソッドを Runnable または Callable にラップします。たとえば、次のようになります。

public class Foo {
    void methodA() {
        try {
        }
        catch(Exception e) {
            bar.methodB(new Runnable() {
                @Override
                public void run() {
                    Foo.this.methodA();
                }
            });
        }
    } 
}

public class Bar {
    void methodB(Runnable runnable) {
        runnable.run();
    } 
}
于 2012-06-03T07:50:59.950 に答える
1

リフレクションを使用しないJavaでは、関数ポインタを定義することは不可能です。

リフレクション ( class java.lang.reflect.Methodを参照) を使用して、この動作をある程度模倣することができますが、一般的に、このコードは奇妙に聞こえます (ただし、何かが得られないかもしれません ;))

于 2012-06-03T07:54:09.293 に答える
0

関数ポインタを渡すことはできません。これを行う最も簡単な方法は、メソッドをインターフェイスにパッケージ化し、関数参照の代わりにインターフェイスを実装するオブジェクトを渡すことです。

于 2012-06-03T07:52:18.030 に答える
0

あなたが探しているのは、ファーストクラスの関数です。あなたの例はmethodAファーストクラスの関数である必要があるので、それに変更しましょう。

次のクラスは、アリティ 0 のファースト クラス関数を表します (引数をとらないことを正式に表す方法です)。

abstract class F0<A> {
  public abstract A apply(); 
}

これを使用すると、コードを次のように書き換えることができます。

F0<Void> methodA = new F0<Void>() {
  @Override
  public Void apply() {
    try {
      // failable actions
    } catch (Exception ex) {
      methodB(methodA);
    }
    return null;
  }
};

void methodB(F0<Void> methodA) {
  methodA.apply();
}

正接:

上記のコードが少しぎこちなく見えることは認めますが、IntelliJ IDEA などの IDE は、そのようなコードの見栄えを良くする「クロージャ フォールディング」と呼ばれるものを提供します。たとえば、このコードが私の IDE でどのように見えるかを確認してください。

このツールチップでジョークを見つけたいと思っていましたか?

于 2012-06-03T08:23:59.817 に答える