我有一个班级(Literal)。我需要能够在整个应用程序中将完整的Literal实例保存在内存中,并拥有一份我可以更改的副本。我用两种方法来做到这一点:
Literal
实现Cloneable
并覆盖Object.clone()
方法。工厂构造函数:
public Literal(Literal lit){
this = lit;
}
在这两种情况下,复制都不起作用。我对副本所做的每一项更改都会更改原件。有没有人知道我做错了什么?
答案 0 :(得分:5)
由于Literal
不是整数类型,Literal
类型的变量对实际值包含引用,因此this = lit
只复制引用,因此你的行为。
您必须递归复制所有成员字段以执行“真实”复制。
这个article与Umesh在评论中关联的问题的接受答案中有关联,我认为它可以解决您遇到的问题所带来的概念性问题。
答案 1 :(得分:1)
如果您打算使用复制构造函数,那么您需要对每个可变成员变量进行深层复制。
假设你的Literal有这样的成员变量:
private String[] args;
private String s;
然后你的拷贝构造函数需要做这样的事情
public Literal(Literal l) {
// have to deep copy the array, otherwise both instances are sharing the reference
this.args = Arrays.copyOf(l.args, l.args.length);
// safe to just copy the reference, String is immutable
this.s = l.s;
}