Клонирование против создания нового класса

Является ли клонирование хорошей практикой в ​​этом случае? Как это сделать лучше?

public ModelCollection startParsing() {

   return parseFeed(new ModelSpecialEntry); 
}

public ModelCollection parseFeed(ModelEntry pattern)  {

   ModelCollection modelCollection = new ModelCollection();

   while( condition ) {

     //TODO: Is cloning the best solution?
     ModelEntry model = (ModelEntry) pattern.clone();



     model.parse();

     //add this item to an collection
     modelCollection.add(model);


   }

   return modelCollection;
}

person OneWorld    schedule 14.09.2010    source источник
comment
' в таком случае?' ты можешь уточнить это?   -  person jmj    schedule 14.09.2010
comment
Расскажите подробнее, зачем вам вообще нужно клонировать этот объект.   -  person mgamer    schedule 14.09.2010
comment
Потому что я хочу завершить коллекцию моделей.   -  person OneWorld    schedule 14.09.2010
comment
Связанный вопрос: stackoverflow.com/ questions / 1106102 /   -  person dogbane    schedule 14.09.2010


Ответы (4)


Клонирование в Java редко бывает хорошей идеей. Попробуйте другие методы, такие как конструкторы копирования или методы Factory.

В Википедии есть хорошая статья о том, почему clone() имеет много недостатков в Java.

Используя конструкторы копирования, создайте конструктор, который принимает экземпляр текущего класса в качестве параметра, и скопируйте все поля в локальном классе:

public class Foo {

    private String bar;
    private String baz;

    public Foo(Foo other) {
        this.bar = other.bar;
        this.baz = other.baz;
    }

}

Используя фабричные методы, создайте метод, который принимает ваш объект в качестве параметра и возвращает объект, содержащий те же значения:

public Foo copyFoo(Foo other) {
    Foo foo = new Foo();
    foo.setBar(other.getBar());
    foo.setBaz(other.getBaz());
}
person Vivien Barousse    schedule 14.09.2010
comment
Вы также можете использовать методы частичного копирования: public withBar(String newBar) { return new Foo(newBar, this.baz); } - person Abhinav Sarkar; 14.09.2010
comment
Вы имеете в виду статический фабричный метод, а не фабричный метод, который можно спутать с шаблоном фабричного метода. - person Diaa; 03.01.2016
comment
Так следует ли избегать шаблона прототипа? - person bluelurker; 30.08.2016

Вы можете использовать конструктор копирования вместо реализации _1 _, но похоже, что у вас есть иерархия из ModelEntry классов, поэтому использование clone может быть лучшим подходом. См. этот вопрос, чтобы узнать, что не так с Cloneable

person Jon Freedman    schedule 14.09.2010

Я считаю, что это похоже на все остальное в программировании: это зависит от спецификации объекта.

Попробуйте провести действительно быстрый тест: клонируйте 100000 объектов и создайте экземпляры того же количества объектов и проверьте время, сколько это займет (System.currentTimeInMilis ()). Часто клон быстрее.

И помните, что с clone есть одна проблема - при добавлении нового поля и т. Д. Вам также необходимо изменить метод clone ().

person Jan Wegner    schedule 14.09.2010
comment
О, изменить метод клонирования? Это необходимо? Я думал, что это просто метод, действующий как конструктор, что тоже не обязательно. - person OneWorld; 14.09.2010
comment
Если вы не реализуете clone в своих классах, вы получите CloneNotSupportedException, когда вы его вызовете. - person Jon Freedman; 14.09.2010

Клонирование - не лучшая идея, как соглашаются многие программисты.

Это подвержено ошибкам. Вы должны осторожно переопределить clone(). Забывание вызова super.clone() - популярная ошибка.

person 卢声远 Shengyuan Lu    schedule 14.09.2010