功能指针 - 传递对自我的引用

时间:2012-06-03 07:46:45

标签: java

您好可以在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 个答案:

答案 0 :(得分: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();
    } 
}

答案 1 :(得分:1)

在不使用反射的java中,不可能定义函数指针。

你可以使用反射(参见类 java.lang.reflect.Method )在某种程度上模仿这种行为,但一般来说这段代码听起来很奇怪(虽然我可能没有得到什么; ))

答案 2 :(得分:0)

您无法传递函数指针。最简单的方法是将方法打包在接口中并传递实现接口的对象而不是函数引用。

答案 3 :(得分:0)

您正在寻找的是一流的功能。您的示例需要methodA作为第一类函数,因此我们将其更改为。

以下类表示具有arity 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中此代码的外观:

Were you hoping to find a joke in this tooltip?