Создание метода глубокого копирования, Java

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

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, а затем под ним я создаю новый массив данных призраков, знает ли он, что данные принадлежат Jadeed GhostList? Я не понимаю, как они могут быть связаны, даже если они должны быть связаны.

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


person Snowman    schedule 16.10.2010    source источник


Ответы (4)


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

person Itay Karo    schedule 16.10.2010

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

return new GhostList(this);

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

jadeed.ghosts = data;

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

person casablanca    schedule 16.10.2010

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

jadeed.foo = data;

прежде чем вы вернетесь jadeed.

person codaddict    schedule 16.10.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

person Isaac    schedule 16.10.2010