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

我的理解是,您希望拦截器返回缓存结果的副本,以便任何客户端修改只会影响副本?

老实说,我想不出一个好的和通用的方法来做到这一点。丑陋的将是依赖clone(),或者每次都创建一个新的列表。

听起来你应该尽可能地修改客户端。

于 2010-01-13T18:08:23.953 回答
0

“更新缓存”是什么意思?您是否担心用户可以修改 methodWithCaching() 返回的 List?如果是这样,我建议该方法返回一个不可修改的集合。或者缓存可以检测到结果是一个 Collection 并用不可修改的包装器包装它。

于 2010-01-13T17:51:55.000 回答