我正在尝试复制一个没有成功的对象。我试过了
这两种方法对我都不起作用。
当我使用序列化(我使用此处指定的技术Faster Deep Copies of Java Objects)时,我得到了NullPointerException
。通过克隆,我得到了原始对象引用。
情景是:
我有一个带有数据char[][] board
的抽象类A和一个扩展类B
。我想为此复制数据board
我在B
- getboard()
和setboard()
中实现了两种方法,并实现了克隆方法,以便
B b1 = new B;
B.initialize();
B b2 new B;
B2 = B1.clone(B2)
但这不起作用。任何帮助将不胜感激。
谢谢: - )
public B clone() {
B N = new B();
try {
N = (B)super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
N.setBoard(this.getBoard());
return N;
}
关于序列化,在反序列化后,当我尝试绘制板时,它给了我NullPointerException
。我的结论是,反序列化无法正常工作。
答案 0 :(得分:1)
覆盖clone
中的B
方法:
public class B {
private int f1;
private String f2;
@Override
public B clone() {
B clone = new B();
clone.f1 = this.f1;
clone.f2 = this.f2;
return clone;
}
}
并使用它来创建副本:
B b1 = new B();
//...
B b2 = b1.clone();
<强>更新强>
public B clone() {
B N = new B();
try {
N = (B)super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
N.setBoard(this.getBoard());
return N;
}
尝试以下方法(假设B
实施Cloneable
):
@Override
public B clone() throws CloneNotSupportedException {
return (B) super.clone();
}
<强>更新强>
board
的自定义实施:
class B implements Cloneable {
private char[][] board;
@Override
public B clone() throws CloneNotSupportedException {
B clone = (B) super.clone();
clone.board = new char[this.board.length][];
for(int i=0; i<this.board.length; i++) {
clone.board[i] = new char[this.board[i].length];
System.arraycopy(this.board[i], 0, clone.board[i], 0, this.board[i].length);
}
return clone;
}
public char[][] getBoard() {
return board;
}
public void setBoard(char[][] board) {
this.board = board;
}
@Override
public String toString() {
return Arrays.deepToString(this.board);
}
}
答案 1 :(得分:0)
在我发现使用第三方库进行对象克隆的过程中,可以节省生命。我建议的其中一个项目是“克隆”,可在http://code.google.com/p/cloning/
获得以下是一个例子:
Cloner cloner=new Cloner();
MyClass clone=cloner.deepClone(o);
// clone is a deep-clone of o