1

在我的应用程序中有一个处理应用程序数据的 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

提前致谢

4

2 回答 2

2

HomeData(saveData和) 的两个实例g.OriginalData都只是对内存地址的引用。当你复制 saveData = g.OriginalData; 您实际上是在复制内存地址。一个对象(像HomeData) behaves different than a simple原始的`(像一个 int 或一个字节),你必须使用方法来访问它们的值。

为了进行某种deepCopy ,您应该覆盖clone()in 中的方法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;
   }

   ....
 }
于 2013-04-03T06:22:37.060 回答
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 个内存分配,并且有 2x 引用它。

建议:-制作一个复制构造函数:

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

用法:

HomeData saveData = new Homedata(homedata);

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

于 2013-04-03T06:30:57.807 回答