缓存完整性问题 - java

我有一个使用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()); //!

可以想象,标记为!的行也会更新缓存实例,这不是我想要的。

有人可以想到一种无需修改客户端(仅拦截器)即可停止此行为的方法吗?

参考方案

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

45码