Создание метода глубокого копирования, Java - PullRequest
1 голос
/ 17 октября 2010

Я хочу сделать метод глубокого копирования. Я обратился за помощью здесь на днях с этой проблемой, но это было для конструктора копирования. Теперь мне нужен обычный метод. У меня есть код, созданный (нерабочий), но я просто не понимаю его полностью.

public GhostList deepCopy(){
        int length=this.getLength();
        GhostList jadeed=new GhostList();
        Ghost[] data = new Ghost[length];
        for (int i=0;i<this.getLength();i++){
            data[i] = new Ghost();
            data[i].setX(this.ghosts[i].getX());
            data[i].setY(this.ghosts[i].getY());
            data[i].setColor(this.ghosts[i].getColor());
            data[i].setDirection(this.ghosts[i].getDirection());
        }

        return jadeed;
    }

Теперь, когда я создаю новый GhostList с именем jadeed, а затем создаю новый массив данных о призраках, знает ли он, что данные принадлежат нефритовому GhostList? Я не понимаю, как эти два могут быть связаны, даже если они должны быть.

Кроме того, я не получаю длины, совпадающие для копии и объекта this.object. В чем моя проблема?

Ответы [ 4 ]

3 голосов
/ 17 октября 2010

Вы создали новый GhostList и новый массив Ghost.
Вы заполняете массив Ghost и возвращаете GhostList, но возвращенный GhostList не имеет ничего общего с Ghostмассив.
Вы должны добавить всех новых призраков в GhostList

2 голосов
/ 17 октября 2010

Сначала вы упомянули конструктор копирования.Если у вас уже есть эта работа, то все, что вам нужно сделать в вашем deepCopy методе:

return new GhostList(this);

Давайте пока что забудем об этом и вернемся к коду, который вы опубликовали.Вы создаете массив с именем data, но вы никогда его не использовали.Разве вы не должны назначать этот массив jadeed?Что-то вроде:

jadeed.ghosts = data;

И, наконец, вместо вызова метода deepCopy было бы лучше вызвать его clone и реализовать Cloneable интерфейс.Это позволяет каждому узнать, как получить копию вашего объекта, используя стандартный интерфейс.

1 голос
/ 17 октября 2010

Ваш класс GhostList будет иметь в качестве члена данных ссылку на массив Ghost.Вы не показали нам определение класса, поэтому допустим, что член имеет имя foo.Теперь все, что вам нужно сделать, это сделать ссылку foo вновь созданного объекта jadeed ссылкой на массив Ghost, который вы создали и заполнили.Вы можете сделать это как:

jadeed.foo = data;

, прежде чем вернуться jadeed.

0 голосов
/ 17 октября 2010

Если GhostList и все, из чего он состоит, это Serializable, вы можете сериализовать экземпляр GhostList в байтовый массив и перечитать его.Это несколько строк кода, если вы не используете ` Jakarta Commons Lang - одна строка кода:

http://commons.apache.org/lang/api-2.5/org/apache/commons/lang/SerializationUtils.html#clone%28java.io.Serializable%29

...