Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Философия clone() 
:(
    Опции темы
chief39
Дата 2.10.2007, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 15
Всего: 77



Никогда как-то и не юзал...

Заюзал.

Тестовый пример выкладываю с вопросом - что упущено может быть?
Код


public class TmpTest extends SpringBaseTest {


    protected String[] getTestFixtures() {
        return new String[0];
    }


    public void testClone() {

        MyClass myObject = new MyClass();
        myObject.stringValue = "xxx";
        myObject.bigDecimalValue = new BigDecimal(111);
        myObject.intValue = 555;
        myObject.integerValue = new Integer(666);
        myObject.subObject = new MySubClass("222");


        try {
            MyClass newObject = (MyClass)myObject.clone();
            newObject.stringValue = "213123";
            newObject.bigDecimalValue = new BigDecimal(54534);
            newObject.intValue = 54534;
            newObject.integerValue = new Integer(543254);
            newObject.subObject.val = "543533";


            System.out.println("myObject:\n" + myObject.toString());
            System.out.println("newObject:\n" + newObject.toString());



        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }

    }

    class MyClass implements Cloneable{
        public String stringValue = "stroka";
        public Integer integerValue = new Integer(15);
        public int intValue = 15;
        public BigDecimal bigDecimalValue = new BigDecimal(15);
        public MySubClass subObject = new MySubClass("111");

        public Object clone() throws CloneNotSupportedException {

            
            MyClass o = (MyClass)super.clone();
            if(this.subObject != null){
                o.subObject = (MySubClass)this.subObject.clone();
            }

            return o;

        }

        public String toString(){
            return new StringBuffer().append("stringValue=").append(stringValue).append("\n")
                    .append("integerValue=").append(integerValue).append("\n")
                    .append("intValue=").append(intValue).append("\n")
                    .append("bigDecimalValue=").append(bigDecimalValue).append("\n")
                    .append("subObject.val=").append(subObject.val).append("\n")
                    .toString();
        }

    }

    class MySubClass implements Cloneable{

        public String val = "111";
        public MySubClass(String str){
            val = str;
        }

        public String toString(){
            return new StringBuffer().append("mySubClass.val=").append(val).toString();
        }

        public Object clone() throws CloneNotSupportedException {
            return super.clone();
        }

    }






--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
COVD
Дата 2.10.2007, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 17
Всего: 43



Зачем в тесте переопределять поля клона? Ведь смысл клона как раз в создании копии обьекта.
PM MAIL   Вверх
chief39
Дата 2.10.2007, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 15
Всего: 77



Цитата(COVD @  2.10.2007,  16:42 Найти цитируемый пост)
Зачем в тесте переопределять поля клона? Ведь смысл клона как раз в создании копии обьекта. 

То есть? не въехал, если честно smile))

Добавлено через 2 минуты и 30 секунд
Типа, зачем новые значения давать клонированному обжекту? Если это - то это просто проверка что старого обжекта поля не цепляет, остатки от прогонки "поверхностного клонирования". 

Я по сути самого клонирования smile
Что ещё такое может быть упущено...

ЗЫ: Если линк в клониремом объекте налловый - супер.клон так и перепишет ведь налл в новый обжект?


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
COVD
Дата 2.10.2007, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 17
Всего: 43



Цитата

Если линк в клониремом объекте налловый - супер.клон так и перепишет ведь налл в новый обжект?


Так вроде да. Проблема при клонировании, насколько помню, в том, что не все значения полей успешно копируются в клон методом clone класса Object. И этот метод в Object сделан протектед для того, чтобы делали свою имплементацию метода clone(). А с null проблемы быть не должно. 
PM MAIL   Вверх
LSD
Дата 6.10.2007, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(chief39 @  2.10.2007,  17:48 Найти цитируемый пост)
ЗЫ: Если линк в клониремом объекте налловый - супер.клон так и перепишет ведь налл в новый обжект?

Да. clone() создает копию объекта и копирует все поля. Т.е. примитивные типы копируются, а ссылочные копируются ссылки.
Для immutable объектов это не создает проблему, а для изменяемых нужны дополнительные телодвижения.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0710 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.