Java拷貝物件

xiasuhuei321發表於2017-12-13

最近有一個需求,要先把檔案從U盤拷貝到sd卡。而這個檔案的路徑則和一個生成的資料有關係,也就是說之前我儲存的路徑是U盤的路徑,最後生成的時候則需要實際在sd卡的路徑。這很簡單,把路徑改了不就成了?

沒那麼簡單,萬一sd卡記憶體不夠呢?不夠你複製,這個時候你前面已經複製了,路徑也改了,資料已經被“汙染”了,只能從頭再配置一遍。這顯然是不合理的做法,所以需要我們拷貝一份原有的資料。但是在Java中預設是引用拷貝,並不是在堆裡面給你另外分配一塊記憶體,給你一個新的物件,而是拷貝一個引用給你。這並沒有什麼卵用,操作的是堆內的同一個物件,依舊逃不過資料被汙染的命。所以需要我們自己實現深度拷貝。

我首先能想到的方案有兩個:

  • 遍歷這個類的所有屬性,將每一個屬性都拷貝一份
  • 先將物件序列化寫入檔案,再從檔案中讀取物件

第一種方式在類比較簡單的時候還是比較實用的,我們為每一個屬性申請記憶體並將值設定好。但是如果這個類內部的屬性很複雜或者有比較複雜的父類,這個時候處理起來就麻煩很多了。第二種方式簡單是簡單,本來也打算就用這種方式來做。後來同事提醒我還有第三種方式:利用Json框架。

是的利用Json框架比如Gson或者FastJson之類的,可以很簡單的將一個實體類轉化為字串,然後我們再將這個字串轉換成一個實體物件,程式碼如下:

Gson g = new Gson();
// 假設此處t是一個指向堆內物件的引用
String s = g.toJson(t);
T newT = g.fromJson(s, T.class);
複製程式碼

相關文章