2012-03-05 57 views
1

是否有可能將函數多態傳遞給Java中的對象數組?Java中的多態函數調用?

我試圖創建一個基於事件的系統,並且接口根本不像我希望的那樣多才多藝。

因此,我希望能夠將任何函數傳遞給事件管理器,並讓它在下一次迭代中執行該函數。

+0

TL; DR - 不,它是不可能的。 – 2012-03-05 04:29:36

回答

3

我想能到任何函數傳遞到事件管理

那豈不是所有的。不幸的是,Java沒有一流的功能,甚至沒有功能指針。所以我們被卡住了接口和匿名類,直到至少Java 8。

1

爲什麼不讓您的活動管理器執行Runnable s,然後用一個包裝您的方法調用? (這是方法搖擺了。)

public class Foo { 
    public void doSomething(){ 
     System.out.println("Hello"); 
    } 
} 

EventQueue.doLater(new Runnable(){ 
    public void run(){ 
     new Foo().doSomething(); 
    } 
} 
+0

'EventQueue.invokeLater'的異步特性是在節目中,這是相當重型機械小跑,直到我們知道應用程序是什麼語義轉移。 – 2012-03-05 04:17:03

1

我不知道爲什麼接口不靈活,足以爲你 - 你可以做任何你喜歡的界面,當然,就像你可以用純粹的傳遞做功能。

通常,您將只定義一個單一的事件處理程序接口:

public interface EventHandler { 
    public ReturnType handle(ParamType param); 
} 

然後你可以實現與任何數量的不同處理類的該接口。處理程序對象甚至可以包含它們自己的狀態(如果有用的話)。然後,您定義的實現該接口的任何東西都可以多形地使用,例如,存儲在一個陣列中,以便可以響應特定事件調用它們。

+0

是的,你可以用界面做任何你喜歡的事情,但是你可以用功能更簡潔明瞭地做到這一點。查看C#的lambda表達式和事件,或者更好的是,使用函數式語言。當你定義一個單方法接口時,你只會創建一個cruft,其中方法的唯一工作將被像匿名類一樣的lambda wannabees覆蓋。 – 2012-03-05 04:19:26

+0

當然,Java語法更加冗長(我大部分時間都是在Clojure中編寫代碼,所以我當然非常欣賞功能性語言的優雅!)。但從實際角度來看,它的工作原理也是一樣,給你所需要的所有靈活性,我認爲這是OP所要求的...... – mikera 2012-03-05 04:25:36

0

Java不支持一流的功能。 但你可以通過使用匿名類或使用EventHandler類來做到這一點。

這是來自Java文檔。

EventHandler最簡單的用法是安裝一個偵聽器,它在沒有參數的目標對象上調用方法。在下面的例子中,我們創建了一個ActionListener,它調用javax.swing.JFrame的一個實例上的toFront方法。

myButton.addActionListener(
    (ActionListener)EventHandler.create(ActionListener.class, frame, "toFront")); 

當按下myButton時,語句frame.toFront()將被執行。人們可以得到相同的效果,有一些額外的編譯時類型安全,通過定義一個新的實現ActionListener接口,並增加它的一個實例到按鈕:

//Equivalent code using an inner class instead of EventHandler. 
myButton.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     frame.toFront(); 
    } 
});