Если значение clone () установлено равным нулю, исходное значение объекта также меняется на ноль - PullRequest
0 голосов
/ 10 августа 2011

Я делаю копию своего объекта с помощью метода clone ().Но когда в копии есть изменение, исходный объект также изменяется.Я попытался повторить мою проблему в следующем примере.Вот 2 класса ClassA и ClassB.

public class ClassB implements Cloneable
{
    int num = 0;

    byte[] bit = new byte[1];

     //Getters and setters have been removed due to space constraint

            public Object clone() 
    {
        try
        {   
          ClassB obj = (ClassB)super.clone();

          obj.setNum(this.num);
               obj.setBit(this.bit);

          return obj;
        } catch (CloneNotSupportedException e) {
                return null;              }
    }
}

// Вот ClassA, который содержит метод main и использует клон

public class ClassA {

    public void cloneMethod(){

        ClassB objB = new ClassB();
        objB.bit[0] = (byte)0x8;
        objB.setNum(5);     

        ClassB objCopy = null;
        objCopy = (ClassB) objB.clone();

        if(objCopy.bit[0] != (byte)0x0)
        {
            objCopy.bit[0] = 0;
        }

        System.out.println(objB.bit[0]); //At this point the original object    value is also modified.

    }

    public static void main(String args[])
    {
        ClassA a = new ClassA();
        a.cloneMethod();
    }

}

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

Ответы [ 3 ]

1 голос
/ 10 августа 2011
obj.setNum(this.num);
obj.setBit(this.bit);

Эти две строки кода являются (а) избыточными и (б) неправильными. Если вам просто нужны исходные значения полей в клоне, вам это вообще не нужно, потому что super.clone () уже сделал это за вас. Если ваша цель - вернуть независимо оцениваемый объект. Поскольку бит [] является массивом, то есть объектом, вы также должны его клонировать.

1 голос
/ 10 августа 2011

Не устанавливайте bit на тот же byte[], что и исходный объект, вместо этого клонируйте его также:

obj.bit = this.bit.clone();

Кроме того, вам не нужно устанавливать num, потому чтоэто уже будет правильно установлено на объекте, возвращаемом super.clone().

0 голосов
/ 10 августа 2011

Вы не клонируете свой массив bit.

...