2016-06-28 8 views
2

私は、(比較的)非侵入型の呼び出しの呼び出しに対する要求と応答のログを行うユーティリティを書きたいと思っていましたが、私はjava-8ラムダ/終わらせる。関数/サプライヤ経由でのラムダ引数へのアクセス

のは、サンプルのクライアント呼び出しのコードがあるとしましょう:

SomeReturn retVal = someObject.doSomething(arg1, arg2); 

私のように呼び出すことができるレコーダーユーティリティの書き込みを期待していた。

SomeReturn retVal = Recorder.withRecording(() -> someObject.doSomething(arg1, arg2)) 

のようなものになりますレコーダー:

public static <R> R withRecording(Supplier<R> call) { 
    R response = call.get(); 
    // Record the response 
    return response; 
} 

しかし、私はリクエスト引数を取得する方法を特定できませんでした。 stオブジェクト)Supplierから(そして正しく - Supplierはそれに関係ありません)。私はjava.util.function.Functionでも、彼ら自身が状態を扱わないので、私たちをここで助けないと思う。

我々は他のどのようなオプションがあります

Object withRecording(Object target, Method method, Object[] arguments) 

のようなものに頼らず? AOPをソリューションとして使用できることはわかっていますが、AOPを使用せずに実行できるかどうかを見たいと思っていました。

ありがとうございます!

+2

もし可能であっても(私はそれは単に)レコーダーの。その録音を無効にしたり削除したりする日が来たら、あなたは帽子を食べます。あなたが言ったように、これはAOPの完璧なシナリオのように思えます。 – Tunaki

答えて

4

これは、既知の有限の機能シグニチャセット(たとえば、

public static <T,U,R> R withRecording(BiFunction<T,U,R> func, T arg1, U arg2) { 
    R response = func.apply(arg1, arg2); 
    // Record arg1, arg2 and the response 
    return response; 
} 

使用可能な

SomeReturn retVal = withRecording(someObject::doSomething, arg1, arg2); 

としてこれだけあなたは、すべてのサポートされ、署名のための1つの過負荷、引数のすなわち明確な数を作成する必要があることを意味するものではありません、あなたはまた、機能ごとに適切なインターフェイスを作成する必要がありますこれらの場合には事前定義されたインタフェースがないため、2つ以上の引数を使用します。さらに

は、その録音しようとしているすべては...

いくつかの機能は、特定の引数と結果ではなく、機能が呼び出された ことで、関数オブジェクト自体は、実際の機能については何も明らかにしないことに注意してください

よりよい解決策は、すべての呼び出しを記録someObjectに委譲し、別の実装を参照してsomeObjectを交換することを可能にする、インターフェースメソッドとして宣言doSomethingを有することであろう。この機能はプロキシを使用して一般的な方法で実装できますが、よくはAOPソリューションとオーバーラップするです...

+0

プロキシへの参照とAOPとの重複に対する回答としてそれを受け入れます。 – Kilokahn

関連する問題