0

オブジェクトを複製しようとしていますが、成功しません。私は試した

  1. シリアル化
  2. クローニング

どちらの方法も私にはうまくいきません。

シリアライゼーションを使用したとき (ここで指定されている手法を使用していますJava オブジェクトのより高速なディープ コピー) を取得しNullPointerExceptionました。複製により、元のオブジェクト参照を取得しました。

シナリオは次のとおりです。

char[][] boardデータと拡張クラスを持つ1つの抽象クラス A がありますB。このためのデータを複製したい にboard2 つのメソッドを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;
}

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);
    }
}
于 2011-11-27T23:43:15.010 に答える
0

時間が経つにつれて、サードパーティのライブラリを使用してオブジェクトのクローンを作成すると、命を救うことができることがわかりました。私がお勧めするプロジェクトの 1 つは "Cloning" です。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 に答える