2013-04-03 23 views
1

在我的應用程序中有一個處理應用程序數據的java類。我想保存該類的內容並進行數據修改並稍後恢復。我被一個問題所注意到,當我在原始數據中進行更改時,保存的副本也會發生變化。我如何避免它。下面顯示的代碼是預先說明性在android中,如何備份java類的內容並進行恢復

public class HomeData { 
    public int n; 

    HomeData(){ 
     n = 10; 
    } 
} 


HomeData homedata; 
homedata.n = 15; 

HomeData saveData = homedata; 

// making changes 
homedata.n = 50; 


homedata = SaveData; 

// i want the value of 'n' in homedata as 15 

感謝

+2

你有沒有試過克隆?它似乎是一個深拷貝/淺拷貝的問題。 – drulabs

+0

我不明白,我是一個新手java/android – Riskhan

回答

2

HomeDatasaveDatag.OriginalData)兩個實例是到存儲器地址僅引用。當你複製saveData = g.OriginalData;你實際上正在複製內存地址。對象(如HomeData) behaves different than a simple primitive`(如int或字節),你必須使用的方法來訪問它們的值。

爲了使某種deepcopy的你應該覆蓋的方法clone()HomeData,其中您確保包含在HomeData單變量和值將被複制

這樣的:

public class HomeData implements Cloneable{ 

    public Object clone(){ 
     HomeData copy= new HomeData(); 
     copy.setValue(this.getValue()); 
     copy.setSomething(this.getSomething()); 

     //... and so on 
     return copy; 
    } 

    .... 
} 
+0

你沒有寫HomeData應該實現可複製'HomeData實現Cloneable'。 – pepuch

+0

我的homedata是包含變量和函數的大類。我是否需要複製所有這些東西才能正常工作。有沒有簡單的方法可用? – Riskhan

+0

你只需要複製homedata的全局變量。但是,是的,你必須如果你想要一個真正的*拷貝*你的'對象'。那麼如果你正在尋找一個快速和骯髒的解決方案還有其他的方法(比如'Serialization',你可以以序列化的形式保存Homedata的內容,然後在你需要的時候反序列化它),但是覆蓋方法'clone()'是實現這一點的標準方法。 – GameDroids

1
HomeData homedata; 
homedata.n = 15; 
HomeData saveData = homedata; // 15 in saveData 
// making changes 
homedata.n = 50; // saveData will have 50 too 

homedata = SaveData;// override the reference... 

問題是你在第一行只有1個內存分配,並且2個引用了它。

建議:-make拷貝構造:

HomeData(HomeData src){ 
this.n = src.n; 
} 

用法:

HomeData SAVEDATA =新Homedata(homedata);

其他解決方案是在其他答案中描述的克隆;

+0

我的homedata是包含變量和函數的大類。我是否需要複製所有這些東西才能正常工作。有沒有簡單的方法可用? – Riskhan

+0

您需要製作深層克隆,(原始)字段的副本和參考的深層克隆 – 2013-04-03 07:55:06