我刚开始学Java,但我一遍又一遍地碰到同样的问题
如何有效地恢复到某个对象的旧状态?
public class Example {
MyObject myLargeObject;
public void someMethod(){
MyObject myLargeMyObjectRecovery = myLargeObject;
/**
* Update and change myLargeObject
*/
if(someCondition){
//revert to previous state of myLargeObject
myLargeObject = myLargeMyObjectRecovery;
}
}
}上面是我希望代码工作的方式,但显然不是这样,因为myLargeObject和myLargeObjectRecovery是对同一对象的引用。
一种解决方案是创建一个复制构造函数。这对于小对象来说很好,但是如果我有一个大对象(在我的项目中,对象是一个大的2D数组,这意味着我必须迭代所有的条目),这种方式感觉是错误的。
这在Java中肯定是一个很常见的问题,其他人是如何解决的呢?
发布于 2013-02-24 21:05:16
如您所述,要么是深度复制,要么可能是序列化。您可以存储序列化的字符串,然后稍后从它重新构造对象。
发布于 2013-02-24 21:26:54
最佳解决方案取决于是否有对MyObject实例的外部引用。
如果仅从Example myLargeObject 类中使用,则可以使用
byte[]必须为transient) 如果您可以从外部访问MyObject实例,那么它将变得更有趣,您必须引入同步。
MyObject上的所有方法都必须是synchronized的(以避免不一致的读取)synchronized void saveState()方法来保存您的状态(通过序列化或复制构造函数)(后者更好)在所有情况下,建议在某个时刻关闭事务(一种commit()),这意味着当您到达那里时,您可以删除保存的状态。
另外,非常重要的一点是,如果你有一个底层的数据结构,你应该遍历整个结构。否则,您可能会遇到对象引用的问题。
要小心JPA实体或任何外部管理的对象,这些方法都不太可能与它们一起工作。
发布于 2013-02-24 21:51:21
如果您将一个对象分配给另一个对象,jvm将引用内存中的同一对象。因此,对象上的更改将在引用的其他objetc中。
MyObject myLargeMyObjectRecovery = myLargeObject;这在您的代码中是相同的。myLargeMyObjectRecovery和myLargeObject引用内存中的同一对象。
如果想精确复制任何对象,可以使用Object.clone()方法。此方法将复制对象并返回一个引用另一个对象的对象,该对象的字段及其值与复制的对象相同。
因为克隆方法是受保护的,所以你不能直接访问它。您可以根据自己的需求实现原型模式。
http://www.avajava.com/tutorials/lessons/prototype-pattern.html
public class MyObject{
//fields, getters, setters and other methods.
public MyObject doClone()
{
MyObject clonedObject = this.clone(); //you may need to override clone()depending on your requirements.
return clonedObject;
}
}并在您的代码中调用它
MyObject myLargeMyObjectRecovery = myLargeObject.doClone();https://stackoverflow.com/questions/15051988
复制相似问题