2010-09-14 18 views
7

¿Existe una buena práctica de clonación en este caso? ¿Cómo hacerlo mejor?Clonación frente a instanciar una nueva clase

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

'¿en este caso?' ¿Puedes elaborarlo? –

+0

Cuéntanos más por qué necesitas clonar este objeto en primer lugar. – mgamer

+0

Porque quiero concluir una colección que contiene modelos. – OneWorld

Respuesta

1

Creo que es como con todo lo demás en la programación: depende del objeto specyfication.

Intente hacer una prueba muy rápida: clone 100000 objetos e instaure la misma cantidad de objetos y compruebe el tiempo que tarda (System.currentTimeInMilis()). A menudo clon es más rápido.

Y recuerde que con clon hay un problema: al agregar un nuevo campo, etc., también debe modificar el método clone().

+0

Ah, ¿modifica el método de clonación? ¿Es esto necesario? Pensé que esto es solo un método que actúa como un constructor, que tampoco es necesario. – OneWorld

+0

Si no implementa 'clone' en sus clases, obtendrá una' CloneNotSupportedException' lanzada cuando lo llame. –

10

La clonación rara vez es una buena idea en Java. Pruebe con otras técnicas como Copiar constructores o Métodos de fábrica.

Wikipedia tiene a nice article en por qué clone() tiene muchas desventajas en Java.

El uso de constructores de copia, crear un constructor que toma una instancia de la clase actual como parámetro, y copiar todos los campos de la clase local:

public class Foo { 

    private String bar; 
    private String baz; 

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

} 

El uso de métodos de fábrica, crear un método que toma el objeto como parámetros y devolver un objeto que contiene los mismos valores:

public Foo copyFoo(Foo other) { 
    Foo foo = new Foo(); 
    foo.setBar(other.getBar()); 
    foo.setBaz(other.getBaz()); 
} 
+0

También puede tener métodos de copia parcial: 'public withBar (String newBar) {return new Foo (newBar, this.baz); } ' –

+0

Se refiere al método de fábrica estático y no al método de fábrica, que podría confundirse con el patrón de método de fábrica – Diaa

+1

¿Entonces debería uno evitar el patrón de prototipo? – bluelurker

2

se puede usar un constructor de copia en lugar de implementar Cloneable, pero parece que tiene una jerarquía de clases ModelEntry, así que usar clone puede ser el mejor enfoque. Ver this question para algunos indicadores sobre cuál es incorrecto con Cloneable

0

Clon no es una buena idea como muchos programadores están de acuerdo.

Es propenso a errores. Debe sobrescribir clone() cuidadosamente. Olvidar invocar super.clone() es un error popular.

Cuestiones relacionadas