Клонирование массива Java странное поведение - PullRequest
0 голосов
/ 17 ноября 2011

Я пытаюсь клонировать экземпляр пользовательского класса под названием CSP. У меня есть один экземпляр под названием csp, и я хочу сделать клон csp под названием cspclone. Вот что я использую для этого:

CSP cspclone = new CSP((csp.x).clone(), (csp.d).clone(), (csp.c).clone());

По какой-то причине, когда я передаю cspclone методу, который его модифицирует, csp модифицируется также, как если бы я забыл функции .clone (), но я этого не сделал! Почему это происходит?!

Ответы [ 4 ]

3 голосов
/ 17 ноября 2011

Переопределить метод clone в CSP:

public class CSP {
    private String aField;
    private int[] array;
    private int[][] twoDArr;
    private List<ALContent> list; //here ALContent also needs to override clone properly

    @Override
    public Object clone() {
        CSP clone = new CSP();
        clone.aField = this.aField;
        clone.array = new int[this.array.length];
        System.arraycopy(this.array, 0, clone.array, 0, this.array.length);

        clone.list = new ArrayList<ALContent>();
        for(ALContent content : this.list) {
            clone.list.add(content.clone()); //make sure you add the clone of the content
        }

        clone.twoDArr = new int[this.twoDArr.length][];
        for(int i=0; i<this.twoDArr.length; i++) {
            clone.twoDArr[i] = new int[this.twoDArr[i].length];
            System.arraycopy(this.twoDArr[i], 0, clone.twoDArr[i], 0, this.twoDArr[i].length);
        }

        return clone;
    }
}

Тогда вы можете сделать:

CSP csp = new CSP();
CSP cspClone = (CSP) csp.clone();
0 голосов
/ 17 ноября 2011

Для решения вашей проблемы вам необходимо глубокое клонирование.Метод клонирования по умолчанию делает поверхностное копирование.Смотрите Object.clone () .

Вот несколько подходов.У всех есть свои преимущества и недостатки.

Вот несколько других обсуждений клонирования в стеке потока:

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

В соответствии с http://download.oracle.com/javase/1.3/docs/api/java/lang/Object.html#clone%28%29

этот метод создает новый экземпляр класса этого объекта и инициализирует все его поля точно содержимым соответствующих полей этого объекта, как если бы он был назначен;содержимое полей не клонируется.Таким образом, этот метод выполняет «мелкую копию» этого объекта, а не «глубокую копию».

Возможно, вам придется переопределить метод клонирования и clone() a атрибут ссылочного типа внутри объекта (т. Е. Выполнение операции глубокого копирования).

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

Если ваши свойства типа массива используют System.arraycopy

...