0

那么我想知道是否有可能有一个方法将另一个方法作为参数传递,所以第一个方法可以调用参数中传递的方法?

比如:

public void goToVisitManagementForm() throws ParseException {
    if (isAuthenticated() && userTypeIs("Patient")) {

         // I could have this whole block just moved to another method?
        Panel newPanel = new Panel("Choose the details for your visit");
        Component visitManagementForm = new VisitManagementForm(userData,
                this);
        newPanel.addComponent(visitManagementForm);
        mainWindow.setMainPanel(newPanel);

    } else {
        authenticate();
    }
}

如果代码块将被移动到另一个方法,并且它将作为参数传递给该方法。我怎样才能做到这一点,这是一个好习惯吗?因为在这种情况下,我有我总是需要粘贴的 ifs……其他方面呢?

4

3 回答 3

4

这称为高阶函数,您不能在 Java 7 或更低版本中执行此操作。您可以通过使用匿名类来模拟将函数传递给其他函数,该类实例化函数期望的某个接口,然后在该对象上调用该函数。

例如,传递一个无参数函数:

interface Function {
    void apply();
}

void takesAFunction(Function function) {
    function.apply();
}

然后下面的代码片段会做你想要的:

Function myFunction = new Function() {
    @Override
    public void apply() {
        // your code here.
    }
};
takesAFunction(myFunction);

作为旁注,反射对于这类问题来说是极端过度的。

于 2013-01-12T05:23:06.773 回答
1

您可以使用Java 反射 API将方法作为参数传递。

首先,您从一个类中获取一个方法对象:

 Class c = MyClass.class;
 Method[] methods = c.getMethods();
 Method m = // choose the method you want

然后您的函数可以将 Method 对象作为参数:

 public void aFunction(MyClass o, Method m);

然后在该函数中,您可以调用该方法:

 m.invoke(o);

这是一个非常简单的示例,其中方法不带任何参数。扩展此示例并添加参数非常容易。

于 2013-01-12T05:26:42.447 回答
0

是的,但这是一个非常先进的程序。您需要使用该Method对象。这是关于方法的javadoc:

这是javadoc:
- http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/Method.html

如果我正确理解您的问题,您希望能够将方法作为参数传递。在 Java 中确实没有“平滑”的方法可以做到这一点。在目标 C 中,它直接内置于语言中,(@selector 标记)

于 2013-01-12T05:25:52.143 回答