3

キャッシュにehcacheを使用するアプリケーションがあります(ただし、この問題はフレームワークに依存しないと思います)。メソッドインターセプターを使用しているため、基本的に、キャッシュ用のメソッドをマークすると、次のようになります。

public Object invoke(MethodInvocation mi) throws Throwable {
        Object result = cache.get(key); 
        //key comes from MethodInvocation processing
        if (result == null) {
            result = mi.proceed();
            cache.put(key, result);
        }
        return result;
}

ここまでは順調ですね。を返すメソッドをキャッシュしていて、次のArrayように呼び出されます。

List<Object> result = methodWithCaching();
result.add(new Object()); //!

ご想像のとおり、 でマークされた行!はキャッシュ インスタンスも更新しますが、これは私が望んでいるものではありません。

クライアントを変更せずにインターセプターのみを変更して、この動作を停止する方法を誰かが考えられますか?

4

2 に答える 2

0

「キャッシュを更新する」とはどういう意味ですか? methodWithCaching() によって返されるリストをユーザーが変更できることを懸念していますか? もしそうなら、メソッドが変更不可能なコレクションを返すことを提案します。または、結果が Collection であることをキャッシュが検出し、それを変更不可能なラッパーでラップすることもできます。

于 2010-01-13T17:51:55.000 に答える
0

私の理解では、インターセプターがキャッシュされた結果のコピーを返すようにして、クライアントの変更がコピーにのみ影響するようにしますか?

正直なところ、それを行うための良い一般的な方法は思いつきません。醜いのは、に依存するclone()か、毎回新しいリストを作成することです。

可能であれば、代わりにクライアントを実際に変更する必要があるようです。

于 2010-01-13T18:08:23.953 に答える