Java 克隆同一类中的函数
我正在用java做一些模拟。我正试图在前面的几步中模拟树的一个节点,然后放弃所有更改并返回到原始状态。但是clone()不会返回正确的结果 节点类:Java 克隆同一类中的函数,java,cloneable,Java,Cloneable,我正在用java做一些模拟。我正试图在前面的几步中模拟树的一个节点,然后放弃所有更改并返回到原始状态。但是clone()不会返回正确的结果 节点类: public class TreeNode implements Serializable,Cloneable{ HashMap<Integer, Tracker> trackers; public Object clone(){ try{ TreeNode node = (TreeNode) super.cl
public class TreeNode implements Serializable,Cloneable{
HashMap<Integer, Tracker> trackers;
public Object clone(){
try{
TreeNode node = (TreeNode) super.clone();
HashMap<Integer, Tracker> newTrackers = new HashMap<Integer, Tracker>;
for (int i=0:i<4:i++){
newTrackers.put(i, node.trackers.get(i).clone());
}
node.trackers = newTrackers;
return node;
}catch(CloneNotSupportException e){
}
return null;
}
public run(){
TreeNode current = root;
TreeNode CopyNode = (TreeNode) current.clone();
foo(CopyNode);
//Here both current and CopyNode have the same changes at trackers
//made by foo()
}
}
球员级别:
public class Player implements Serializable,Cloneable{
private int points;
public Player clone(){
try{
return (Player) super.clone();
}catch (CloneNotSupportException e){
}
return null;
}
}
注意:我无法将apache函数用于org.apache.commons.lang.SerializationUtils等,请将克隆方法更改为:
public TreeNode clone(){
try {
TreeNode node = (TreeNode) super.clone();
node.trackers = (HashMap<Integer, SomeOtherClass>) trackers.clone();
return node;
} catch (CloneNotSupportedException e) {
return null;
}
}
每当一个对象引用另一个对象时,您都需要克隆这些对象。由于Player没有对对象的引用,只有基元类型,所以现在应该可以正常工作了 您正在进行浅层克隆,请参见(1)未返回正确的结果-然后返回什么?(2) 这段代码无法编译。(3) 不要使用
clone
。SomeOtherClass
是否不可变?如果没有,您还需要克隆/复制这些数据。@realponsust 1)数据结果非常广泛,但通过这样做,我希望当前节点保持不变,所有更改都将发生在CopyNode上。2) 代码不会编译,因为它是问题的抽象版本。当您发布代码并询问我们为什么它不工作时,您应该确保问题是可复制的。这意味着它应该编译,并且应该重现您正在显示的问题-a是最好的。问题陈述应该清楚。我相信这是解决方案,但我无法让它运行。我用更改更新了问题。知道怎么回事吗?在run()函数中,原始节点和克隆节点在foo()之后具有相同的值。我只想更改传递给foo()的节点foo是否更改存储在HashMap中的对象(不仅仅是添加/删除条目,而是修改现有元素)?如果是这样,您还需要克隆HasMap中的对象。我会更新答案。如果你还没有读到我链接到的帖子的第二个答案,你应该读一读。是的,这两个答案都变了。在我发布我的问题之前,我已经阅读了另一个问题并尝试了很多东西。我尝试了复制构造函数,但它也不起作用。正如我所说,Tracker类需要一个正确实现的克隆。跟踪器有一个玩家的参考,你也需要复制它。我会再次更新答案
public TreeNode clone(){
try {
TreeNode node = (TreeNode) super.clone();
node.trackers = (HashMap<Integer, SomeOtherClass>) trackers.clone();
return node;
} catch (CloneNotSupportedException e) {
return null;
}
}
public TreeNode clone(){
try {
TreeNode node = (TreeNode) super.clone();
HashMap<Integer, SomeOtherClass> newTrackers = new HashMap<>();
for (Integer key : trackers.keySet()) {
newTrackers.put(key, trackers.get(key).clone());
}
node.trackers = newTrackers;
return node;
} catch (CloneNotSupportedException e) {
return null;
}
}
public Tracker clone() {
try {
Tracker newTracker = (Tracker) super.clone();
newTracker.player = player.clone();
return newTracker;
} catch (CloneNotSupportException e){
}
return null;
}