Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.80/30: Рейтинг темы: голосов - 30, средняя оценка - 4.80
1 / 1 / 2
Регистрация: 04.08.2013
Сообщений: 83

Метод clone() выдает ошибку

30.09.2013, 14:29. Показов 6530. Ответов 43
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем сначала я переопределяю метод clone():
Java
1
2
3
4
5
6
@Override
        public Student clone() throws CloneNotSupportedException
        {
            Student cloneStud=(Student)super.clone();
            return cloneStud;
        }
Потом создаю экземпляр этого класса , и мне необходимо создать другой объект который будет клоном первого, сделал так:
Java
1
Student student3 =(Student) student1.clone();
Но оно выдает ошибку:
CloneNotSupportedException =\
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.09.2013, 14:29
Ответы с готовыми решениями:

Каким образом работает метод clone() ?
Когда мы переопределяем метод clone, то мы вызываем super.clone(). Он должен возвращать Object, но каким образом мы потом можем этот...

Выдает ошибку метод итераций
program nn; type f=function (z:real):real; var x, eps, s:real; function tralialia (x:real):real; begin ...

Метод Synchronize выдает ошибку
есть поток, который создается по нажатию клавиши Thr.BrsThr = new BrowserThread(true); Thr.BrsThr->FreeOnTerminate=true; ...

43
91 / 91 / 10
Регистрация: 18.05.2013
Сообщений: 265
01.10.2013, 18:26
Студворк — интернет-сервис помощи студентам
2Gibby:
1) Прочитайте еще раз мой пост и Вы увидите ту фразу, про которую Вы рассказываете, что она пропущена.
2) О каких трудностях Вы говорите ? Я лично их не испытываю, пока я вижу только трудность в том, что не смог на пальцах объяснить Вам суть вопроса, так, как это сделал mutagen.
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
01.10.2013, 18:26
Цитата Сообщение от Gibby Посмотреть сообщение
Проблема конструктора или фабрики на самом деле вот в этом:
в этом коде проблема в том что вы вызвали
Цитата Сообщение от Gibby Посмотреть сообщение
super.clone();
не глядя как реализован парент, вы что хотите сказать что вы так и наследуете классы обычно?
не глядя в код?
1
 Аватар для Gibby
154 / 154 / 10
Регистрация: 16.10.2012
Сообщений: 354
Записей в блоге: 1
01.10.2013, 18:32
Цитата Сообщение от mutagen Посмотреть сообщение
это всё та же проблема deepCopy из массивов, решать её лучше копирующим конструктором, так как в таком случае это вас автоматически спасает от кучи проблем с наследованием и других
Возможно. Но может быть все-таки не надо напяливать на копирующий конструктор API клона?

Добавлено через 4 минуты
Цитата Сообщение от mutagen Посмотреть сообщение
не глядя как реализован парент, вы что хотите сказать что вы так и наследуете классы обычно?
не глядя в код?
В конвенции сказано: хочешь клонировать - вызови super.clone. Я так и делаю. Я отвечаю за поля наследника. За поля родителя отвечает автор родителя. Зачем лезть в код, если все играют по правилам?
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
01.10.2013, 18:32
Цитата Сообщение от Gibby Посмотреть сообщение
Возможно. Но может быть все-таки не надо напяливать на копирующий конструктор API клона?
ок давайте наоборот, предложите вариант как сделать копию в классе SimpleCloneableProblem и унаследовав его в SimpleCloneableProblemChild не получить одинаковые ссылки на лист
1
 Аватар для Gibby
154 / 154 / 10
Регистрация: 16.10.2012
Сообщений: 354
Записей в блоге: 1
03.10.2013, 10:39
Цитата Сообщение от mutagen Посмотреть сообщение
ок давайте наоборот, предложите вариант как сделать копию в классе SimpleCloneableProblem и унаследовав его в SimpleCloneableProblemChild не получить одинаковые ссылки на лист
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/**
 *
 * @author popov
 */
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
 
class SimpleCloneableProblem implements Cloneable {
    private List<Integer> li;
 
    public SimpleCloneableProblem(List<Integer> li) {
        this.li = li;
    }
 
    @Override
    public int hashCode() {
        int hash = 7;
        hash = 29 * hash + Objects.hashCode(this.li);
        return hash;
    }
 
    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final SimpleCloneableProblem other = (SimpleCloneableProblem) obj;
        if (!Objects.equals(this.li, other.li)) {
            return false;
        }
        return true;
    }
 
    public SimpleCloneableProblem myClone(SimpleCloneableProblem s) {
        ArrayList<Integer> al = new ArrayList<>();
        al.addAll(s.li);
        return new SimpleCloneableProblem(al);
    }
 
    @Override
    protected SimpleCloneableProblem clone()  {
        try {
            SimpleCloneableProblem c = (SimpleCloneableProblem) super.clone();
            ArrayList<Integer> al = new ArrayList<>();
            al.addAll(this.li);
            c.li = al;
            return c;
        } catch (CloneNotSupportedException e ) {
            throw new AssertionError();
        }
        
    }
 
    @Override
    public String toString() {
        return "SimpleCloneableProblem{" + "li=" + li + '}';
    }
    
}
 
 
class SimpleCloneableProblemChild 
        extends SimpleCloneableProblem 
        implements Cloneable {
    public SimpleCloneableProblemChild(List<Integer> li) {
        super(li);
    }
   
    @Override
    public SimpleCloneableProblemChild clone() { 
        return (SimpleCloneableProblemChild)super.clone();
    }
}
 
class Cloning {
    public static void main(String[] args) {
        List<Integer> l = new ArrayList<Integer>() {
            {
                add(1);
                add(2);
                add(3);
            }
        };
        SimpleCloneableProblemChild sc = new SimpleCloneableProblemChild(l);
        SimpleCloneableProblemChild scBad = sc.clone();
        System.out.println("sc = bad: " + sc.equals(scBad));
        System.out.println("bad = sc: " + scBad.equals(sc));
        System.out.println("Now add 10 to list");
        l.add(10);
//        Изменили модифабельный объект и нет никакой проблемы
        System.out.println("sc = bad: " + sc.equals(scBad));
        System.out.println("bad = sc: " + scBad.equals(sc));
        System.out.println("sc: " + sc);
        System.out.println("scBad: " + scBad);
    }
}
Добавлено через 11 минут
Проблема будет, если li будет объявлен как final. Тогда, наверное, не получится использовать clone. Но тогда и не надо объявлять объект Cloneable. Но я и не утверждал, что clone применим всюду. Более того, если верить тому же Блоху программисты предпочитают clone не использовать.

Добавлено через 17 минут
Цитата Сообщение от edwin3d Посмотреть сообщение
1) Прочитайте еще раз мой пост и Вы увидите ту фразу, про которую Вы рассказываете, что она пропущена.
В вашем посте нет фразы "By convention, the returned object should be obtained by calling super.clone." Я даже [Ctrl] + [F] использовал, не доверяя собственным глазам.

Вам смысл этой фразы понятен? Каждый класс, реализующий Cloneable, должен вызвать super.clone(). Только в таком случае цепочка вызовов дойдет до Object, и там выполнится клонирование области памяти минуя конструкторы класса.

Я уже объяснил причину - только в таком любой наследник сможет вызвать super.clone() и получить клон себя, а не своего родителя.

Добавлено через 20 минут
Цитата Сообщение от edwin3d Посмотреть сообщение
2) О каких трудностях Вы говорите ? Я лично их не испытываю, пока я вижу только трудность в том, что не смог на пальцах объяснить Вам суть вопроса, так, как это сделал mutagen.
Извините, я неправильно прочитал ваш пост.
Я нигде не утверждал, что метод clone хорош или правилен. Я нигде не утверждал, что безконструкторное создание объекта - это комильфо. Я утвеждаю, что если вы пишете метод clone и реализуете интерфейс Cloneable, вы должны в соответствии конвенцией вызывать super.clone. Если вам это не нравится - не реализуйте Cloneable, не пишите clone, пишите копирующий конструктор или копирующую фабрику с понятными сигнатурами (public Foo(Foo bar) {...} и public static Foo newInstance(Foo bar) {...}), не путайте пользователя.
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
03.10.2013, 10:52
Цитата Сообщение от mutagen Посмотреть сообщение
в этом коде проблема в том что вы вызвали super.clone()
не глядя как реализован парент, вы что хотите сказать что вы так и наследуете классы обычно?
не глядя в код?
Я вот что-то в упор не понимаю сути спора. Одни выступают за копирующий конструктор, другие - за вызов super.clone. А я вот как-то разницы не вижу. Если clone по всей цепочке написан грамотно - мы получим правильный результат. И точно та же ситуация с копирующим конструктором. Копирующий конструктор родителя не спасет априори в случае неправильно реализованного clone родителя - он тоже может быть реализован неправильно. Или отсутствовать вообще.

Спор теологический?
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
03.10.2013, 10:59
Gibby, у вас нарушение конвенции налицо )))
1. оверриднутый метод должен возвращать Object а не класс )
2. как быть с классами которые содержат кроссреференсы в коллекциях или нежёсткие ссылки ) клонить их или оставлять ссылки на реальные? например какой нибудь WeakHashMap )))
3. вы сделали в чайлде имплементацию Cloneable, но это же необязательно, на дочерний класс не распространяются обязательства по имплементации интерфейса из парента, равно как может возникнуть вариант что в парентах нет имплементации клонейбла, но есть колеекции и тд, а в чайлде вам приспичило имплементировать клонейбла. как вы заставите парента правильно вернуть вам инстанс через super.clone() ???

Добавлено через 1 минуту
Цитата Сообщение от Skipy Посмотреть сообщение
Если clone по всей цепочке написан грамотно - мы получим правильный результат.
вот это ключевое замечание, обычно никогда нет такой грамотной цепочки в реальной жизни )))
поэтому клонинг фигня )

Добавлено через 1 минуту
Цитата Сообщение от Skipy Посмотреть сообщение
Копирующий конструктор родителя не спасет априори в случае неправильно реализованного clone родителя
в копирующем конструкторе вас никто не обязывает юзать клонинг, вы просто создаёте полностью новый инстанс, без всяких суперклонов и правильно инициализируете все поля класса, паренты и собственные

вот почему он предпочтительнее

Добавлено через 1 минуту
Цитата Сообщение от Skipy Посмотреть сообщение
Спор теологический?
кто-то давит на конвенцию, а у кого-то опыт ))) селяви )
0
 Аватар для Gibby
154 / 154 / 10
Регистрация: 16.10.2012
Сообщений: 354
Записей в блоге: 1
03.10.2013, 11:04
Цитата Сообщение от mutagen Посмотреть сообщение
1. оверриднутый метод должен возвращать Object а не класс )
А вот и нет. Начиная с Java 6 существует ковариантность типов возвращаемых значений - переопределяя метод мы можем вернуть любой тип-наследник, при условии, что он не нарушает принцип подстановки Б.Лисков.

Цитата Сообщение от mutagen Посмотреть сообщение
2. как быть с классами которые содержат кроссреференсы в коллекциях или нежёсткие ссылки ) клонить их или оставлять ссылки на реальные? например какой нибудь WeakHashMap )))
рекурсивно клонить/копировать все мутабельные поля.

Цитата Сообщение от mutagen Посмотреть сообщение
3. вы сделали в чайлде имплементацию Cloneable, но это же необязательно, на дочерний класс не распространяются обязательства по имплементации интерфейса из парента
Я в наследнике переопределил clone и предупредил об этом реализовав Cloneable.

Цитата Сообщение от mutagen Посмотреть сообщение
равно как может возникнуть вариант что в парентах нет имплементации клонейбла, но есть колеекции и тд, а в чайлде вам приспичило имплементировать клонейбла
Ну, захотеть мы можем все, что угодно, но если в родителе нет clone, то и в наследнике мы не сможем реализовать clone, потому что не сможем прокинуть цепочку до Object.
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
03.10.2013, 11:09
Цитата Сообщение от mutagen Посмотреть сообщение
равно как может возникнуть вариант что в парентах нет имплементации клонейбла, но есть колеекции и тд, а в чайлде вам приспичило имплементировать клонейбла. как вы заставите парента правильно вернуть вам инстанс через super.clone() ???
Ну, положа руку на сердце, - с тем же успехом эти коллекции могут быть private, а копирующий конструктор отсутствовать в принципе. И тогда ситуация не лучше использования clone.

Коллеги, я считаю, что спор ни о чем. Грамотно реализованный clone по всей цепочке способен дать нужный результат. И грамотно реализованный копирующий конструктор - по всей цепочке! - способен. Использование того или другого - дело вкуса. Я предпочитаю конструкторы, они мне кажутся более наглядными, что ли...

А обсуждать неграмотные реализации... Наворотить можно где угодно.

Добавлено через 1 минуту
Цитата Сообщение от Gibby Посмотреть сообщение
Ну, захотеть мы можем все, что угодно, но если в родителе нет clone, то и в наследнике мы не сможем реализовать clone, потому что не сможем прокинуть цепочку до Object.
Вы хотите сказать, что он там явно не прописан? Ну, это не означает, что его там нет. Он там возьмется из Object, в котором он native. Проверено на цепочке из нескольких классов, в которых только последний Cloneable.

Добавлено через 1 минуту
Цитата Сообщение от mutagen Посмотреть сообщение
в копирующем конструкторе вас никто не обязывает юзать клонинг, вы просто создаёте полностью новый инстанс, без всяких суперклонов и правильно инициализируете все поля класса, паренты и собственные
При отсутствии копирующего конструктора у родителя и private коллекциях к него же у Вас нет способов правильно инициализировать поля родителя. Вы к ним банально не имеете доступа.
0
 Аватар для Gibby
154 / 154 / 10
Регистрация: 16.10.2012
Сообщений: 354
Записей в блоге: 1
03.10.2013, 11:10
Цитата Сообщение от Skipy Посмотреть сообщение
Вы хотите сказать, что он там явно не прописан? Ну, это не означает, что его там нет. Он там возьмется из Object, в котором он native. Проверено на цепочке из нескольких классов, в которых только последний Cloneable.
Да. Ошибся. Я с какого-то перепугу решил, что он сразу выбросит CloneNotSupportedException

Другое дело, что тогда может быть некорректное клонирование полей родителя.
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
03.10.2013, 11:20
Цитата Сообщение от mutagen Посмотреть сообщение
Цитата Сообщение от Skipy
Если clone по всей цепочке написан грамотно - мы получим правильный результат.
вот это ключевое замечание, обычно никогда нет такой грамотной цепочки в реальной жизни )))
Gibby, вот тут я соглашусь с mutagen-ом. В реальной жизни правильный clone пишут несравненно реже, чем правильный копирующий конструктор. Я могу за себя сказать - я в своих классах clone не реализую вообще никогда. Так что если Вы захотите унаследоваться от моих классов - Вы точно не сможете правильно клонироваться. А вот копирующие конструкторы у меня бывают. Хотя и редко.

В общем, я не хочу сейчас в этот спор сильно влезать. Подводя итог: оба способа рабочие при правильной реализации. На практике в подавляющем большинстве случаев применяются копирующие конструкторы. Всё.

P.S. Хотя глубокое копирование объекта как таковое - крайне неприятное занятие. Слишком много проблем.

P.P.S. 2 mutagen. Мне трудно представить, как скопировать элементы коллекции с помощью копирующий конструкторов малой кровью. Это же как придется с рефлексией плясать... А с другой стороны, требовать, чтобы все элементы в иерархии были Cloneable... утопия.

P.P.P.S. 2 Gibby. Подумайте вот над чем. Чтобы скопировать правильно коллекцию через клонирование, все ее элементы должны быть Cloneable. И вообще, все классы, которые хоть как-то задеваются этим клонированием. Вы готовы взять на себя ответственность за такое ограничение?
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
03.10.2013, 11:26
Цитата Сообщение от Gibby Посмотреть сообщение
рекурсивно клонить/копировать все мутабельные поля.
кроссреференсы это бесконечный луп на рекурсии )))
0
 Аватар для Gibby
154 / 154 / 10
Регистрация: 16.10.2012
Сообщений: 354
Записей в блоге: 1
03.10.2013, 11:28
Skipy, я еще раз повторю свой тезис:
если в моем классе есть implements Cloneable и метод clone, то я
а) следуя конвенции вызываю метод super.clone
б) убеждаюсь, что все поля родителей правильно клонируются
в) обеспечиваю правильное клонирование уникальных полей наследника.

Если я не могу сделать что-то из этого, я не пишу clone и не реализую Cloneable. Я делаю конструктор или фабрику с понятной сигнатурой.

Цитата Сообщение от Skipy Посмотреть сообщение
P.P.P.S. 2 Gibby. Подумайте вот над чем. Чтобы скопировать правильно коллекцию через клонирование, все ее элементы должны быть Cloneable. И вообще, все классы, которые хоть как-то задеваются этим клонированием. Вы готовы взять на себя ответственность за такое ограничение?
Не понял утвеждения. Насколько я понял, мы должны вызвать super.clone только для самого объекта. Его поля мы можем копировать как нам заблагорассудится. В том числе вызывая их конструкторы. Разве не так?
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
03.10.2013, 11:29
Цитата Сообщение от Gibby Посмотреть сообщение
то и в наследнике мы не сможем реализовать clone, потому что не сможем прокинуть цепочку до Object.
сможем без проблем )))
0
 Аватар для Gibby
154 / 154 / 10
Регистрация: 16.10.2012
Сообщений: 354
Записей в блоге: 1
03.10.2013, 11:30
Цитата Сообщение от mutagen Посмотреть сообщение
кроссреференсы это бесконечный луп на рекурсии )))
Я нуб и не знаком с кроссрефенсами. Можно пример?
Я в целом догадываюсь, но хочется убедиться.
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
03.10.2013, 11:31
Цитата Сообщение от Skipy Посмотреть сообщение
Вы к ним банально не имеете доступа.
ну вобщем то рефлекшен, хотя это уже выходит за рамки )
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
03.10.2013, 11:42

Не по теме:

Цитата Сообщение от mutagen Посмотреть сообщение
ну вобщем то рефлекшен, хотя это уже выходит за рамки )
Простой reflection Вам доступа к private-полю не даст, только в сочетании с setAccessible, а он регулируется уже SecurityManager-ом и при его установке по умолчанию запрещен...



Добавлено через 7 минут
Цитата Сообщение от Gibby Посмотреть сообщение
Skipy, я еще раз повторю свой тезис:
Хорошо, я еще раз расскажу про свой опыт

если в моем классе есть implements Cloneable и метод clone, то я
а) следуя конвенции вызываю метод super.clone
б) убеждаюсь, что все поля родителей правильно клонируются
В 99.99% случаев Вы убеждаетесь, что поля родителя клонируются неправильно.

в) обеспечиваю правильное клонирование уникальных полей наследника.

Если я не могу сделать что-то из этого, я не пишу clone и не реализую Cloneable. Я делаю конструктор или фабрику с понятной сигнатурой.
Если Вся иерархия клонирования не находится под Вашим контролем - В 99.99% случаев Вы будете создавать конструкторы, фабрики и т.п. Если вообще сможете (родительские классы могут банально не предоставлять средств копирования).

Не понял утвеждения. Насколько я понял, мы должны вызвать super.clone только для самого объекта. Его поля мы можем копировать как нам заблагорассудится. В том числе вызывая их конструкторы. Разве не так?
Пусть у Вас есть коллекция объектов. Как Вы будете копировать объекты в этой коллекции? Напишите код прямо сейчас и здесь. Да, у объектов есть внутреннее состояние, снаружи недоступное. И копирующего конструктора нет.
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
03.10.2013, 11:48
Цитата Сообщение от Gibby Посмотреть сообщение
Можно пример?
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/**
 *
 * @author mutagen
 */
public class CrossRefTst {
 
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        One o = new One();
        Two t = new Two();
        o.setT(t);
        t.setO(o);
        System.out.println(o);
    }
 
    static class One {
 
        public Two getT() {
            return t;
        }
 
        public void setT(Two t) {
            this.t = t;
        }
        private Two t;
 
        @Override
        public String toString() {
            return "One{" + "t=" + t + '}';
        }
    }
 
    static class Two {
 
        public One getO() {
            return o;
        }
 
        public void setO(One o) {
            this.o = o;
        }
        private One o;
 
        @Override
        public String toString() {
            return "Two{" + "o=" + o + '}';
        }
    }
}
запустите и увидите проблему )

Добавлено через 2 минуты
Цитата Сообщение от Skipy Посмотреть сообщение
Простой reflection Вам доступа к private-полю не даст, только в сочетании с setAccessible, а он регулируется уже SecurityManager-ом и при его установке по умолчанию запрещен...
ну мы можем и asm использовать
0
 Аватар для Gibby
154 / 154 / 10
Регистрация: 16.10.2012
Сообщений: 354
Записей в блоге: 1
03.10.2013, 12:06
mutagen,
Цитата Сообщение от Gibby Посмотреть сообщение
Я нуб и не знаком с кроссрефенсами. Можно пример?
Я в целом догадываюсь, но хочется убедиться.
Я так понял, это что-то вот такого вида:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class A {
    B b;
}
 
class B {
    C c;
}
 
class C {
    A a;
}
 
class Abc {
    public static void main(String[] args) {
        A a = new A();
        B b = new B();
        C c = new C();
        
        a.b = b;
        b.c = c;
        c.a = a;
    }
}
?

Skipy, я ведь ни с чем из этого не спорю Я говорю лишь, что не надо вводить пользователей в заблуждение вот такими финтами:

Java
1
2
3
4
5
6
7
8
9
10
11
class Foo implements Cloneable {
    //Поля и методы
    private Foo(Foo bar) {
        //Копирование полей и методов
    }
    
    @Override public Foo clone() {
        Foo bar = new Foo(this);
        return bar;
    }
}
Цитата Сообщение от Skipy Посмотреть сообщение
Да, у объектов есть внутреннее состояние, снаружи недоступное. И копирующего конструктора нет.
Но тогда в общем случае я никакими способами не смогу создать 100% корректную копию этого объекта.

Добавлено через 12 минут
Цитата Сообщение от mutagen Посмотреть сообщение
запустите и увидите проблему )
Ну наверное в данном частном случае я могу реализовать что-то такое:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    static class One implements Cloneable {
 
        public Two getT() {
            return t;
        }
 
        public void setT(Two t) {
            this.t = t;
        }
        private Two t;
 
        @Override public One clone() {
            try {
                One o1 = (One)super.clone();
                Two o2 = new Two();
                o2.setO(o1);
                return o1;
            } catch (CloneNotSupportedException e) {
                throw new AssertionError();
            }
        }
            
        @Override
        public String toString() {
            return "One{" + "t=" + t + '}';
        }
    }
Но если я захочу сделать Two implements Clonable, написать вместо "Two o2 = new Two();" "Two o2 = o1.t.super.clone();" и сделать аналогично у Two, то тут у меня начнутся проблемы
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
03.10.2013, 12:16
Цитата Сообщение от Gibby Посмотреть сообщение
Ну наверное в данном частном случае я могу реализовать что-то такое:
я привёл вам простенький синтетический пример, иногда обьекты такой сложной структуры, что вы даже не будете знать есть ли в них кроссрефы или нет )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.10.2013, 12:16

Метод простой итерации выдает ошибку
Делаю вот такой пример но выдает ошибку под А и В, не могу понять в чем дело, помогите, завтра сдавать.a0=; b0=; a=; b=; for...

Метод Range.Find выдает ошибку
Всем привет! Такая вот занятная штука. Хотел использовать Find, чтобы найти фрагмент формулы. Как ни бился, VBA ругается на код, выдает...

Метод вычисляющий значения выдает ошибку компиляции
Добрый день возникла проблема.Выдаёт ошибку при компиляции,вроде всё правильно делал. using System; using System.Collections.Generic; ...

Метод Paste (Excel, OLE) иногда выдает ошибку
Доброго дня. Делаю вставку из одного файла EXCEL в другой с помощью OLE. Проверяю работу программы на одних и тех же файлах и иногда...

Выдает ошибку, что метод getPreventDefault является устаревшим
Доброго времени суток ругается Метод getPreventDefault() является устаревшим. Для его замены используйте метод defaultPrevented. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время? Никакой пенсии. Никакого нового. . .
сукцессия 41
anaschu 24.07.2026
Численная верификация бифуркации в агентной модели лесной сукцессии: от одного параметра к ансамблю Автор: пользователь @Shumilov_AS | Раздел: Прикладная математика / Численные методы Кратко. . .
сукцессия 40. Ансамблевая кластерная параметризаци, часть 1.
anaschu 24.07.2026
Пр# Сопровождение научной статьи ИИ-ассистентом: подготовка публикации и калибровка агентно-ориентированной модели сукцессии микоризных систем **Полевые заметки о двухнедельной совместной работе**. . .
Теория всего 12. ВГК на планете в стратегической игре "терра"
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru