JavaRush /Java блог /Архив info.javarush /Функции метода Object.clone()
pro100boy
41 уровень
Днепр

Функции метода Object.clone()

Статья из группы Архив info.javarush
Всем привет. Хочу спросить совета или подсказку. Несколько дней не могу решить простую на первый взгляд задачу на рекурсивное клонирование. Тут в разделе "Функции метода Object.clone()" есть пример Snake. И вопрос: как сделать глубокое клонирование Snake?
Комментарии (2)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
pro100boy Уровень 41
27 августа 2015
Решил таки… Через костыль tmp, но… Может кто предложит вариант лаконичнее.

public class Snake implements Cloneable {
    private Snake next, tmp;
    private char c;

    // Значение i == количеству сегментов
    Snake(int i, char x) {
        c = x;
        if(--i > 0)
            next = new Snake(i, (char) (x + 1));
    }

    void increment() {
        c++;
        if(next != null)
            next.increment();
    }

    public String toString() {
        String s = ":" + c;
        if(next != null)
            s += next.toString();
        return s;
    }

    @Override
    public Object clone() {
        Snake o = null;
        try {
            o = (Snake)super.clone();
        } catch(CloneNotSupportedException e) {
            System.err.println("Змея не может быть клонирована");
        }

        Snake tmp = next;

        while (tmp != null)
        {
            o.next = (Snake)tmp.clone();
            tmp = tmp.tmp;
        }

        return o;
    }
    public static void main(String[] args) {
        Snake s = new Snake(5, 'a');
        System.out.println("s = " + s);
        Snake s2 = (Snake)s.clone();
        System.out.println("s2 = " + s2);
        s.increment();
        System.out.println("after s.increment, s = " + s);
        System.out.println("after s.increment, s2 = " + s2);

    }
}
pro100boy Уровень 41
23 августа 2015
Кручусь вокруг да около… Никак не могу отойти от этого шаблона.


    @Override
    public Object clone() {
        Snake o = null;
        try {
            o = (Snake)super.clone();
        } catch(CloneNotSupportedException e) {
            System.err.println("Змея не может быть клонирована");
        }

        while (next != null)
        {
            o.next = (Snake)next.clone();
            next = next.next;
        }

        return o;
    }