問題:spring boot/jpa專案中,修改某個物件以後需要生成乙個vo物件給客戶端,資料庫對應的pojo物件裡有個map型別的物件(名字叫para),這個物件的value又是個map,我使用map的putall()方法拷貝了乙份para,然後修改裡面的值,最後發現para的內容也被修改了。示例**如下:
this.para.putall(po.getpara());
// fields是para下面的乙個map引數,此處本意是返回給客戶端的fields元素中不包含aaa和bbb兩個字段
list> fields = (list>)this.para.get("fields");
fields.foreach(item -> );
以上**出現的問題是,返回給介面的vo中確實沒有了aaa和bbb兩個字段,但不幸的是,對應資料庫中的fields中也沒有了這兩個字段,這不是期望的。
原因:map的putall實現的是淺拷貝。
解決方法:實現深拷貝,有三種方式:
手動賦值,效率高,但**過於囉嗦。
序列化與反序列化,使用serializationutils的clone(object obj)方法,要求拷貝的物件實現了serializable,map不行,使用hashmap即可。
用fastjson從object轉成json,然後轉回object,本質上是反射:
private object deepcopybyjson(object obj)
具體使用哪種方法視具體場景而定,我解決這個問題用的是serializationutils,效能要求不高的情況下**簡潔也很重要。
解決方式:
this.para = (map) serializationutils.clone((hashmap)po.getpara());
阻止拷貝的三種方式
有些時候我們在定義乙個類的時候不希望其中的拷貝控制成員 拷貝構造和拷貝賦值 起作用,也就是阻止拷貝,這時候可能有人會想,那我們乾脆不定義這樣的拷貝控制函式不就ok了,但悲催的是如果自己不定義,好心的編譯器也會及時的學習雷鋒好榜樣幫你合成定義,即傳說中的合成拷貝構造 合成拷貝賦值。既然如此,應該如何操...
拷貝物件的三種方式
物件拷貝又叫物件轉殖或物件複製,要求在不影響原物件及其內容的情況下,產生該物件的乙個副本並順利工作。物件轉殖一般用於把物件初始化為預設狀態。根據這幾天的觀察,共總結出三種物件拷貝的方法,下面分別介紹。在介紹之前,首先要分清淺拷貝和深拷貝之間的區別。所謂淺拷貝,是指拷貝了物件整體的引用或者物件內部某些...
java的執行緒的三種方式
編寫多執行緒程式是為了實現多工的併發執行,從而能夠更好地與使用者互動。一般有三種方法,thread,runnable,callable.runnable和callable的區別是,1 callable規定的方法是call runnable規定的方法是run 2 callable的任務執行後可返回值,...