Дублирующий объект - PullRequest
       16

Дублирующий объект

0 голосов
/ 28 ноября 2011

Я пытаюсь скопировать объект безуспешно.Я пытался

  1. Сериализация
  2. Клонирование

у меня оба метода не работают.

Когда я использовал сериализацию (яиспользуя методику, указанную здесь Более быстрое глубокое копирование объектов Java ) Я получил NullPointerException.С клонированием я получил оригинальную ссылку на объект.

Сценарий:

У меня есть один абстрактный класс A с данными char[][] 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.Я делаю вывод, что десериализация не сработала должным образом.

Ответы [ 2 ]

1 голос
/ 28 ноября 2011

Переопределить метод 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);
    }
}
0 голосов
/ 28 ноября 2011

Со временем я обнаружил, что использование сторонней библиотеки для клонирования объектов может спасти жизнь.Один из проектов, который я бы порекомендовал, это «Клонирование», доступное по адресу http://code.google.com/p/cloning/

Вот пример:

Cloner cloner=new Cloner();

MyClass clone=cloner.deepClone(o);
// clone is a deep-clone of o
...