参考fnc

时间:2010-03-25 15:32:38

标签: java

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.

感谢您的回答

3 个答案:

答案 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!");
    }   
}});