复制对象

时间:2011-11-27 23:03:03

标签: java object duplication

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

  1. 序列化
  2. 克隆
  3. 这两种方法对我都不起作用。

    当我使用序列化(我使用此处指定的技术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。我的结论是,反序列化无法正常工作。

2 个答案:

答案 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