java中有没有办法做这样的事情:
void fnc(void Reference_to_other_func());
我正在尝试的是基本上我有多少地方需要向用户显示相同的文本,唯一的区别是在此文本之后调用哪个方法。例如,而不是写:
System.out.println("Hello");
f1();
//in some other place
System.out.println("Hello");
f2();
//etc
我想定义一个函数:
public void f(void Reference_to_other_func())
{
System.out.println("Hello");
Reference_to_other_func();//HERE I'M INVOKING
}
然后我可以写下这样的代码,而不是重复整个代码:
f(f1);
//in some other place
f(f2)
//etc.
感谢您的回答
答案 0 :(得分:4)
Java没有一流的功能,这使得大多数功能编程技术的实现有点繁琐。
在这种情况下,您可以创建一个界面:
public interface Callback {
void doCallback();
}
(编辑:或您可以使用java.util.concurrent.Callable<V>
,这允许您指定返回类型)
然后声明f
以获取此接口的实例:
public void f(Callback callback) {
System.out.println("Hello");
callback.doCallback();
}
并将此接口的实例传递给函数:
f(new Callback() {
public void doCallback() {
f1();
}
});
f(new Callback() {
public void doCallback() {
f2();
}
});
正如你所看到的,除非你这么做很多,否则收益不会变得明显。
答案 1 :(得分:2)
通过反射,您可以获得实际的Method对象,然后执行。
public void f(Method m) { System.out.println("Hello"); m.invoke(this, null); }
答案 2 :(得分:0)
不幸的是(IMHO)方法(函数)不是java中的第一类对象,这意味着你不能创建匿名或命名方法,而不首先将它附加到类。
你可以实现一个只做一件事的类(例如,像Callable或Runnable那样)
您可以像这样创建一个匿名类:
Runnable x = new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
}
}; //<-- notice the semi-colon.
你可以像这样定义你的函数:
public void f( Runnable x ) {
System.out.println("Hello");
x.run();
}
}
并称之为。
...
// call the f-function :-)
f( new Runnable(){
@Override
public void run() {
System.out.println("World!");
}
}});