Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 克隆同一类中的函数_Java_Cloneable - Fatal编程技术网

Java 克隆同一类中的函数

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

我正在用java做一些模拟。我正试图在前面的几步中模拟树的一个节点,然后放弃所有更改并返回到原始状态。但是clone()不会返回正确的结果

节点类:

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;
}