复制java实例并存储在第一个实例中,如何将值从第二个实例复制回第一个实例?

时间:2011-06-08 03:46:17

标签: java performance

public class Example {
    public Example duplicate;

    public void duplicateState() {
        this.example = this.clone();
    }

    public void loadDuplicate() {
        // implementation
    }
}

查看上面的示例,您可以看到我需要复制Example实例。这样,想要修改Example的对象必须改为修改副本,允许主实例运行例程而不更改关键变量。示例将定期加载副本的值,以便它可以使用更新的变量执行例程。性能在这方面至关重要。有没有人知道如何以最快的方式实现loadDuplicate功能,还是有其他方法来解决这个问题?

4 个答案:

答案 0 :(得分:3)

使用java的序列化功能,然后将其反序列化。

有关详细信息,请参阅this article

答案 1 :(得分:1)

这不是回答,但是评论

如果您使用clone()并自己完成所有分配(如下面提到的答案,实际上是正确的),从维护的角度来看,请注意,如果您/其他人将新字段添加到Example类(说几个月后你可能需要相应地更新你的mimic()方法,这很容易错过。因此,除非你注意到真正的性能问题(你肯定不会这样做),最好坚持使用内置的序列化......只需要我的2美分..(我知道你只需浅色复制,但仍然......)

P.S。无法评论,因为我是SO的新用户

答案 2 :(得分:0)

首先,我认为这不会比串行化到字节数组(或其他一些内存结构)和反序列化更快或更好,但如果你坚持“保存”状态使用clone,只需实现一个与clone()方法相反的方法:

public class Example {
    public Example example;
    private Content content;
    //... more fields

    public void saveState() {
        this.example = this.clone();
    }

    public void loadState() {
        mimic( example );
    }

    public Example clone() {
        Example clone = new Example();
        clone.content = this.content;
        clone.example = this.example;
        //... you're doing this with all your fields I presume
        return clone;
    }

    public void mimic( Example model ) {
        this.content = model.content;
        this.example = model.example;
        //... and so on.
    }
}

答案 3 :(得分:0)

如果您确实需要最快的表现,那么duplicateState()loadDuplicate()都应包含Example字段的一系列分配。

克隆和序列化都会明显变慢,但“多少”将取决于字段数量及其类型。

另一个问题是,您是否需要对Example的状态进行深度或浅层复制。克隆(使用默认的clone()方法将为您提供浅拷贝,序列化将为您提供(递归)深拷贝。

(FWIW - 最后一点是序列化比克隆慢的原因。另一个原因是序列化还需要包含串行形式的元数据......这就是要复制的更多数据。)