簡體   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