2010-03-25 8 views
1

有沒有在java的方式做這樣的事情:參考fnc

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

f1()和f2()必須在同一個類中嗎? – 2010-03-25 15:39:07

+0

你爲什麼要這樣做?您可以直接傳遞對變量或對象的引用或調用方法。您也可以嘗試使用功能語言,您可以像Haskell一樣執行此操作。 – 2010-03-25 15:50:48

回答

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(); 
    } 
}); 

正如你所看到的,除非你這樣做了很多,否則增益不會變得明顯。

2

通過反射,你可以得到實際的方法對象,然後做。

public void f(Method m) { System.out.println("Hello"); m.invoke(this, null); } 
+0

是的,但實際上獲取Method對象是很長的一部分。 – 2010-03-25 15:41:28

0

不幸的是(恕我直言)方法(函數)是Java不是第一類對象,這意味着你不能創建匿名或命名方法,而無需首先將其連接到一個類。

您可以實現一類只能做一件事(例如,如可贖回或Runnable的一樣)

您可以創建一個匿名類是這樣的:

Runnable x = new Runnable(){ 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 

     } 

    }; //<-- notice the semi-colon. 

,你可以定義你的函數˚F這樣的:

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