Клонирование против создания нового класса - PullRequest
8 голосов
/ 14 сентября 2010

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

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

Ответы [ 4 ]

10 голосов
/ 14 сентября 2010

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

В Википедии есть хорошая статья о том, почему 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());
}
2 голосов
/ 14 сентября 2010

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

1 голос
/ 14 сентября 2010

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

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

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

0 голосов
/ 14 сентября 2010

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

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

...