在我的java项目中,我有两个类Atom
和SExpression
,我需要能够克隆。这些都实现了Expression
。我的Atom
类只包含一个String
,我相信它是不可变的,因此可以使用以下内容安全地克隆类,因为String
无法修改。
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
然而,SExpression
类更复杂,因为它有3个字段:SExpression parent,SExpression next和Expression data。这样expr.data.parent就是与expr相同的实例。
@Override
public Object clone() throws CloneNotSupportedException {
SExpression clonedExpr = (SExpression) super.clone();
if(clonedExpr.next != null)
clonedExpr.next = (SExpression) clonedExpr.next.clone();
if(clonedExpr.data != null)
clonedExpr.data = (Expression) clonedExpr.data.clone();
return clonedExpr;
}
但是,您可以想象父字段仍然引用旧父字段。有人有解决方案吗?我唯一能想到的是可能有一个类变量,当前父项的SExpression
,每次克隆数据时都会将其设置为这个,这似乎是一个巨大的黑客攻击。
有什么想法吗?
答案 0 :(得分:0)
似乎是您克隆整个链接列表而不是单个表达式。 在parent = null,next = null;
的位置执行此操作答案 1 :(得分:0)
这个问题可以帮到你:
Deep clone utility recomendation
特别是克隆库在其中一个答案中推荐:
http://code.google.com/p/cloning/
我没有玩过图书馆,但看起来它可能会覆盖你。