public class Example {
public Example duplicate;
public void duplicateState() {
this.example = this.clone();
}
public void loadDuplicate() {
// implementation
}
}
查看上面的示例,您可以看到我需要复制Example实例。这样,想要修改Example的对象必须改为修改副本,允许主实例运行例程而不更改关键变量。示例将定期加载副本的值,以便它可以使用更新的变量执行例程。性能在这方面至关重要。有没有人知道如何以最快的方式实现loadDuplicate
功能,还是有其他方法来解决这个问题?
答案 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 - 最后一点是序列化比克隆慢的原因。另一个原因是序列化还需要包含串行形式的元数据......这就是要复制的更多数据。)