こんにちは、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
}
こんにちは、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
}
いいえ。ただし、オブジェクト自体を渡すことができます。
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();
}
}
リフレクションを使用しないJavaでは、関数ポインタを定義することは不可能です。
リフレクション ( class java.lang.reflect.Methodを参照) を使用して、この動作をある程度模倣することができますが、一般的に、このコードは奇妙に聞こえます (ただし、何かが得られないかもしれません ;))
関数ポインタを渡すことはできません。これを行う最も簡単な方法は、メソッドをインターフェイスにパッケージ化し、関数参照の代わりにインターフェイスを実装するオブジェクトを渡すことです。
あなたが探しているのは、ファーストクラスの関数です。あなたの例は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 でどのように見えるかを確認してください。