是否可以创建一个方法来将方法作为参数传递并在其中调用?

时间:2013-01-12 05:17:15

标签: java methods

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

例如:

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,我总是需要粘贴... 那其他方面呢?

3 个答案:

答案 0 :(得分:4)

这称为higher-order function,您无法在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);

作为旁注,对于这类问题,反思是极端的过度杀伤。

答案 1 :(得分:1)

您可以使用Java Reflection 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);

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

答案 2 :(得分:0)

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

上的javadoc

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

如果我正确理解您的问题,您希望能够将方法作为参数传递。在Java中实际上没有“平滑”的方法。在目标C中,它内置于语言(@selector标签)