繁体   English   中英

如何从番石榴缓存加载器获取缓存的值并更新该值而不更改缓存中的值?

[英]How can I get the value of a cache from guava cacheloader and update the value without changing the value in cache?

我正在使用番石榴 LoadingCache 来存储Animal类型的对象,其中键是动物名称。 到现在为止还挺好。

然后我使用get()方法获取缓存的对象并检索 Animal 对象。 之后,我添加这样一行: animal.setColor("blue");

之后我意识到番石榴缓存中以前的颜色也被改变了。 我知道在 java 中修改对象也会将其更改为原始状态(类似于传递引用)。 但是对于缓存,我认为这会在我的代码中引入一些奇怪的错误。 如何获取副本而不用担心某些代码是否正在更新刚刚从缓存中检索到的对象?

从缓存中获取对象,您必须复制该对象。 没有可靠、有效、通用的方法来做到这一点——不过,在你的 Animal 类中编写一个复制构造函数是一种合乎逻辑的方法。

或者您可以停止使用可变对象,这可以普遍防止此类错误。

我也遇到过类似的情况,所以我使用了 apache commons 库中的SerializationUtils.clone 确保这不会被频繁调用,因为根据 javadoc,它的深层复制机制非常慢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM