嗯,我想知道是否有可能有一个方法,其中另一个方法作为参数传递,所以第一个方法可以调用在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();
}
}
如果代码块将被移动到另一个方法,它将作为参数传递给该方法。我怎样才能做到这一点,这是一个好的做法吗?因为在这种情况下,我总是需要粘贴。其他方面呢?
这被称为高阶函数,在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);
作为旁注,对于这种类型的问题,反射是极端多余的。
您可以使用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);
这是一个非常简单的例子,其中方法不接受任何参数。在这个例子上扩展并添加参数也很容易。
是的,但这是一个非常高级的程序。您需要使用Method
对象。下面是javadoc on Method:
这里是javadoc:
——http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/Method.html
如果我正确理解你的问题,你希望能够传递一个方法作为参数。在Java中确实没有"流畅"的方法来做到这一点。在objective C中,它被内置到语言中,(@selector tag)