0

我试图复制一个没有成功的对象。我试过了

  1. 序列化
  2. 克隆

这两种方法都不适合我。

当我使用序列化(我使用这里指定的技术Faster Deep Copies of Java Objects)时,我得到了NullPointerException. 通过克隆,我得到了原始对象引用。

场景是:

我有一个带有数据的抽象类 Achar[][] board和一个扩展类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。我的结论是,反序列化没有正常工作。

4

2 回答 2

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

尝试以下操作(假设Bimplements 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);
    }
}
于 2011-11-27T23:43:15.010 回答
0

随着时间的推移,我发现使用第三方库进行对象克隆可以挽救生命。我推荐的项目之一是“克隆”,可在http://code.google.com/p/cloning/ 获得

这是一个例子:

Cloner cloner=new Cloner();

MyClass clone=cloner.deepClone(o);
// clone is a deep-clone of o
于 2011-11-27T23:33:25.423 回答