Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Философия clone()


Автор: chief39 2.10.2007, 13:15
Никогда как-то и не юзал...

Заюзал.

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


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();
        }

    }




Автор: COVD 2.10.2007, 16:42
Зачем в тесте переопределять поля клона? Ведь смысл клона как раз в создании копии обьекта.

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

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

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

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

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

Автор: COVD 2.10.2007, 17:38
Цитата

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


Так вроде да. Проблема при клонировании, насколько помню, в том, что не все значения полей успешно копируются в клон методом clone класса Object. И этот метод в Object сделан протектед для того, чтобы делали свою имплементацию метода clone(). А с null проблемы быть не должно. 

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)