2013-04-03 19 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