我正在尝试制作一个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也包含类似于上面看到的克隆方法。
我对这段代码的问题在于我希望它顺时针旋转一个立方体,但它唯一的旋转是最后一个。
答案 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;
}