2013-02-25 33 views
6

在Java中創建function objects(一種無狀態對象,用於導出可用於其他對象的單一方法)的最佳做法是什麼?在Java中導出函數對象的最佳做法是什麼?

+1

你可以通過看'Comparator'接口得到一些啓示:http://docs.oracle.com/javase/6/docs /api/java/util/Comparator.html。這是一個開放式問題。 – 2013-02-25 13:30:27

+2

[Java中函數指針最接近的替代物是什麼?](http://stackoverflow.com/questions/122407/whats-the-nearest-substitute-for-a-function-pointer-in-java) – Raedwald 2013-02-25 13:32:21

回答

5

它的啓發看看forthcoming Java 8 functional interfaces

Java的8類庫有一個新的包,java.util.functions,其中 包含幾個新功能接口。其中許多可以與Collections API一起使用 。

如果你遵循這裏展示的模式,你將有一個功能接口(一個支持一個方法的接口)和一個沒有成員的實現。你的函數對象不應該調用可能改變它們狀態的方法參數的任何方法(即展示副作用)。不幸的是,你不能強制執行 - 你必須依靠這個慣例。

+0

這可以用功能性語言強制執行嗎? – Geek 2013-02-25 13:42:57

+0

我相信強制執行不變性的語言可以強制執行此操作。也許還有C++及其強大的常量語義,儘管我不想在此引用它! – 2013-02-25 13:44:39

3

Java是一種面向對象的編程語言,因此使用策略設計模式。

+1

雖然策略在此工作,但不需要策略對象僅實現一種方法,因爲功能對象需要 – 2013-02-25 13:43:52

2

Java8應該有lambda表達式來簡化功能接口實現的創建。 Java8之前,你可以看看番石榴庫提供什麼: Functional Explained

這裏是文件的摘錄:

番石榴提供了兩種基本「功能」界面: 功能,它具有單一的B法適用(A輸入)。函數的實例通常被認爲是透明的 - 沒有副作用 - 並且與等號一致,也就是說,a.equals(b)意味着function.apply(a).equals(function.apply(b) )。 Predicate,它具有單一方法布爾應用(T輸入)。通常預計謂詞的實例是無副作用的並且與等號一致。

0

好的評論後,這裏是一個答案: 還有就是要傳遞一個函數沒有簡單/便捷方式。

大多數時候,你會宣佈它實現了例如像一個接口的內部類中,Comparatorhttp://docs.oracle.com/javase/6/docs/api/java/util/Comparator.html

,作爲參數,給人們帶來了很多的所謂的設計圖形的功能不能順利通過的事實,在那裏傳遞聲明具有這些函數的對象類/接口。

正如其他人的生命中提到將得到一個輕鬆一點與Java 8

相關問題