如何在对象上复制而不是在Java中复制其内存地址

时间:2015-05-21 23:28:11

标签: java object reference copy clone

我正在尝试制作一个ObjectA的副本,其中包含另一个ObjectB,其中还有6个其他的ObjectC,但我不想拥有任何内存地址的副本,所以如果我稍后更新任何原始对象,它不会更新副本的值(由所有三个对象组成)。我已经尝试过实现clone()但是仍然无法正常运行。

这是我想要做的(是的,我知道这看起来很荒谬......):

   void rotateEntireCubeClockwise(){

  System.out.println("Changing view of cube...rotating entire cube clockwise...");
  CubeAlgorithms a2 = clone();
  cube.left = a2.clone().cube.clone().front.clone();
  cube.front = a2.clone().cube.clone().right.clone();
  a2.clone().rotateTopClockwise(1);
  cube.top = a2.clone().cube.clone().top.clone();
  a2.clone().rotateTopCounterClockwise(1);//undo
  a2.clone().rotateLeftClockwise(2);
  cube.back = a2.clone().cube.clone().left.clone();
  a2.clone().rotateLeftCounterClockwise(2);//undo
  a2.clone().rotateBackClockwise(2);
  cube.right = a2.clone().clone().cube.clone().back.clone();
  a2.clone().rotateBackCounterClockwise(2);//undo
  a2.clone().rotateBottomClockwise(1);
  cube.bottom = a2.clone().cube.clone().bottom.clone();
}

public CubeAlgorithms clone() {
    try {
        return (CubeAlgorithms) super.clone();
    } catch (CloneNotSupportedException e) {        
        e.printStackTrace();
        throw new RuntimeException();
    }
}

CubeAlgorithms包含一个Cube对象,Cube对象包含6个CubeSide对象(前,左,后,右,下和上)

Cube和CubeSides也包含类似于上面看到的克隆方法。

我对这段代码的问题在于我希望它顺时针旋转一个立方体,但它唯一的旋转是最后一个。

2 个答案:

答案 0 :(得分:0)

这通常被称为"深拷贝。"没有一种方法可以做到这一点;所有被深深复制的课程都必须以某种形式提供帮助。

一种方法是使用复制构造函数(即构造函数CubeAlgorithms(CubeAlgorithms))在所有传入对象的字段上执行深层复制。当然,要对这些内容进行深层复制,您需要做一些与它们类似的事情 - 依此类推。

另一种方法是,如果您的类都是可序列化的,并且性能不是一个大问题,那就是序列化和反序列化您的对象。在这里,我不一定是指java的内置序列化:你可以使用Jackson来JSON-ify然后再读出那些JSON字符串等等。

答案 1 :(得分:0)

我认为您的代码看起来很复杂,因为在该方法中,您尝试克隆该对象并同时修改它(旋转它)。

此外,您正在调用"克隆"所有对象的方法多次,所以每次你都要创建一个新的副本。这可以解释为什么只应用最后一个操作。

我建议你分开操作并首先克隆整个立方体(包含它内部的所有子对象)然后一旦你有了新的Cube对象,然后旋转那个(原来的那个不会)由于第二个对象是一个单独的对象,因此可以旋转。)

要克隆对象,你应该写一个" clone"所有类中的方法。 "克隆"方法应该创建一个新的类实例,然后通过克隆它们来填充属性。

例如,在" Cube"类:

public Cube clone() {
    Cube newCube = new Cube();
    newCube.front = this.front.clone();
    newCube.back = this.back.clone();
    newCube.left = this.left.clone();
    newCube.right = this.right.clone();
    newCube.top = this.top.clone();
    newCube.bottom = this.bottom.clone();
    return newCube ;
}

然后你应该实现其他类' "克隆"方法以类似的方式(创建一个新实例,然后用" this"实例)中的属性克隆填充属性。

成功克隆对象后,请执行旋转所需的任何操作(并且您不需要调用"克隆"多次,只需克隆一次立方体)。 / p>

Cube rotateEntireCubeClockwise(Cube originalCube) {
   Cube newCube = originalCube.clone;
   // now manipulate the "newCube" to make sure it rotates
   // ...
   return newCube;
}