function objects
Java で (他のオブジェクトで動作する単一のメソッドをエクスポートするステートレス オブジェクト)を作成するベスト プラクティスは何ですか?
4 に答える
近日公開予定の Java 8 の機能的インターフェースを見ることは有益です。
Java 8 クラス ライブラリには、いくつかの新しい関数インターフェイスを含む新しいパッケージ java.util.functions があります。これらの多くは Collections API で使用できます。
ここに示されているパターンに従うと、関数型インターフェイス (1 つのメソッドをサポートするインターフェイス) と、メンバーのない実装が得られます。関数オブジェクトは、状態を変更する可能性がある (つまり、副作用を示す) メソッド引数でメソッドを呼び出してはなりません。残念ながら、それを強制することはできません。これについては、規則に依存する必要があります。
Java はオブジェクト指向プログラミング言語であるため、ストラテジー デザイン パターンを使用します。
Java8には、関数型インターフェース実装の作成を容易にするラムダが必要です。Java8より前では、guavaライブラリが提供するものを見ることができます。機能の説明
ドキュメントの抜粋は次のとおりです。
Guavaは、2つの基本的な「機能的」インターフェースを提供します。単一のメソッドB apply(A input)を持つFunction。関数のインスタンスは、一般に、参照透過性(副作用なし)であり、equalsと一致していることが期待されます。つまり、a.equals(b)は、function.apply(a).equals(function.apply(b) )。単一メソッドbooleanapply(T input)を持つ述語。述語のインスタンスは、通常、副作用がなく、equalsと一致していると予想されます。
コメントした後、ここに答えがあります。関数を渡す簡単で便利な方法はありません。
ほとんどの場合、次のようなインターフェースを実装する内部クラスを宣言しますComparator
:
http://docs.oracle.com/javase/6/docs/api/java/util/Comparator.html
関数をパラメーターとして渡すことができないという事実は、多くのいわゆる設計パターンを生み出しました。そこでは、それらの関数を持つことを宣言するオブジェクト クラス/インターフェイスを渡します。
他の人が述べたように、Java 8 を使用すると生活が少し楽になります。