深度复制我有些麻烦 . 我有这个java项目,象棋,我需要使用clone()方法,因为我需要尝试新的配置而不需要更改板 .
Board scacchiera = new Board();
Initialization(scacchiera);
Board clone = scacchiera.clone();
System.out.println(scacchiera.toString());
System.out.println(clone.toString());
我创建了一个对象,scacchiera,然后我克隆它 . 我认为我已经正确地完成了深层复制,但是当我在scacchiera中更改某些内容时,克隆也会发生变化 . 在对象板上:
public class Board implements Cloneable{
//TODO
//rivedere se check e checkmate public o private;
//se private, costruire get e set;
public Pedine[][] board;
public boolean check;
public boolean checkmate;
//creating 2 lists for all the pieces; Neri=black, Bianchi=White
public ArrayList<Pedine> Neri;
public ArrayList<Pedine> Bianchi;
public Board(){
this.board = new Pedine [8][8];
this.check = false;
this.checkmate = false;
this.Neri = new ArrayList<Pedine>();
this.Bianchi = new ArrayList<Pedine>();
}
...
@Override
public Board clone() throws CloneNotSupportedException{
Board cloned = (Board) super.clone();
cloned.board = (Pedine[][]) board.clone();
return cloned;
}
我有这个Pedine的双数组,我也必须克隆它,所以我这样做:
public class Pedine implements Cloneable{
private int x;
private int y;
private Piece pezzo;
private Colour colore;
...
@Override
public Pedine clone() throws CloneNotSupportedException{
return (Pedine) super.clone();
}
为什么它不起作用?
我也尝试了这个代码,但它不起作用 .
@Override
public Board clone() throws CloneNotSupportedException{
Board cloned = (Board) super.clone();
cloned.board = (Pedine[][]) board.clone();
for (int i=0; i<8; i++)
for(int j=0; j<8; j++){
cloned.board[i][j] = board[i][j].clone();
}
return cloned;
}
(Pedine扩展对象)
2 回答
正如Sharonbn所指出的那样,这个问题属于双重阵容 . 虽然您可以使用双循环手动克隆它,但您的国际象棋引擎将遭受性能损失:您将克隆许多电路板,并且您可以从使它们更容易复制中受益 .
一种选择是使用平面阵列和一些聪明的寻址来加快速度:
现在,您使用
at(col, row)
而不是访问board[row][col]
. 复制和创建电路板要容易得多:......现在应该按预期工作了 .
我也强烈建议使用不可变的部分,没有任何状态信息 . 例如,您当前的作品有一个
x
和y
字段 . 他们需要什么?你应该在移动时告诉他们他们的实际位置;这样,你根本不需要克隆碎片 - 因为所有的棋子都是完全相同的,你实际上可以使用相同的"black pawn"来处理与黑棋相关的所有东西 .深度克隆多维数组应该是自定义编码的,如here所述