首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中恢复到旧的对象状态

在Java中恢复到旧的对象状态
EN

Stack Overflow用户
提问于 2013-02-24 21:03:45
回答 4查看 2.2K关注 0票数 1

我刚开始学Java,但我一遍又一遍地碰到同样的问题

如何有效地恢复到某个对象的旧状态?

代码语言:javascript
复制
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中肯定是一个很常见的问题,其他人是如何解决的呢?

EN

回答 4

Stack Overflow用户

发布于 2013-02-24 21:05:16

如您所述,要么是深度复制,要么可能是序列化。您可以存储序列化的字符串,然后稍后从它重新构造对象。

票数 1
EN

Stack Overflow用户

发布于 2013-02-24 21:26:54

最佳解决方案取决于是否有对MyObject实例的外部引用。

如果仅从Example myLargeObject 中使用,则可以使用

  • 在保存点处序列化对象,并在恢复点处反序列化(序列化后的byte[]必须为transient)
  • 在保存点处使用复制构造函数创建新实例(执行深度复制),并替换恢复点处的引用。

如果您可以从外部访问MyObject实例,那么它将变得更有趣,您必须引入同步。

  • 您在MyObject上的所有方法都必须是synchronized的(以避免不一致的读取)
  • 您应该有一个synchronized void saveState()方法来保存您的状态(通过序列化或复制构造函数)(后者更好)
  • 您应该有一个D29,您可以在其中内部恢复您的状态(对于复制字段,您可以使用带有复制代码的通用代码片段

在所有情况下,建议在某个时刻关闭事务(一种commit()),这意味着当您到达那里时,您可以删除保存的状态。

另外,非常重要的一点是,如果你有一个底层的数据结构,你应该遍历整个结构。否则,您可能会遇到对象引用的问题。

要小心JPA实体或任何外部管理的对象,这些方法都不太可能与它们一起工作。

票数 0
EN

Stack Overflow用户

发布于 2013-02-24 21:51:21

如果您将一个对象分配给另一个对象,jvm将引用内存中的同一对象。因此,对象上的更改将在引用的其他objetc中。

代码语言:javascript
复制
MyObject myLargeMyObjectRecovery = myLargeObject;

这在您的代码中是相同的。myLargeMyObjectRecoverymyLargeObject引用内存中的同一对象。

如果想精确复制任何对象,可以使用Object.clone()方法。此方法将复制对象并返回一个引用另一个对象的对象,该对象的字段及其值与复制的对象相同。

因为克隆方法是受保护的,所以你不能直接访问它。您可以根据自己的需求实现原型模式。

http://www.avajava.com/tutorials/lessons/prototype-pattern.html

代码语言:javascript
复制
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;
    }

    }

并在您的代码中调用它

代码语言:javascript
复制
MyObject myLargeMyObjectRecovery = myLargeObject.doClone();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15051988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档