java如何从guava cacheloader获取缓存的值,并在不更改缓存中的值的情况下更新该值?
我使用guava LoadingCache来存储类型为Animal
的对象,其中键是动物名。到目前为止还不错
然后我使用get()
方法获取缓存对象并检索动物对象。在那之后,我添加一行如下:animal.setColor("blue");
之后,我意识到番石榴缓存中以前的颜色也在改变。我知道在java中修改对象也会将其更改为原始状态(类似于通过引用传递)。但是对于缓存,我认为这会在我的代码中引入一些奇怪的bug。如何获取副本而不必担心某些代码是否正在更新刚从缓存中检索到的对象
# 1 楼答案
我也遇到了类似的情况,所以我使用了apache commons库中的
SerializationUtils.clone
。确保不经常调用它,因为根据javadoc,它的深度复制机制非常慢# 2 楼答案
从缓存中获取对象后,必须复制对象。不过,没有可靠、高效、通用的方法可以证明在动物类中编写副本构造函数是一种合乎逻辑的方法
或者你可以停止使用可变对象,这可以防止这些类型的错误