2013-05-02 13 views
8

Ero alla ricerca di tutorial online sulla clonazione di java, ma ho trovato solo gli svantaggi di clone() e nulla sui vantaggi. Vorrei sapere alcuni dei vantaggi dell'uso di Java clone().Vantaggi di Java Cloning

risposta

10

La clonazione ha sicuramente un suo utilizzo. Immagina qualsiasi tipo di applicazione aziendale in cui siano presenti record di dati, rappresentati in oggetti, che puoi "salvare come" (duplicare e rinominare). Se tali dati sono conservati in un oggetto che implementa l'interfaccia Cloneable, è possibile clonare l'originale e aggiornarlo con le nuove informazioni.

Questo è superiore alla creazione di una nuova istanza di oggetto e alla copia di tutti i dati in modo esplicito. Alcune persone si rivolgono a questo con classi di helper e metodi che eseguono la copia, ma poi si hanno le informazioni richieste per copiare una classe al di fuori della classe stessa che è una programmazione OO scadente.

Un altro caso di utilizzo che mi piace è quando uso una classe come backing store per una GUI e che la GUI ha un pulsante di reset. Quando la GUI è inizializzata, io clone l'oggetto del backing store. Quindi, se l'utente preme il ripristino, ho appena reinizializzato la GUI ai valori nell'oggetto clone, piuttosto che capire quali informazioni potrebbero aver cambiato o ottenere una nuova copia delle informazioni originali dalla memoria. Ci sono molti usi, certamente.

Ma come sapete, la clonazione può sollevare problemi in un sistema di ereditarietà e raggruppa classi di dati altrimenti leggere, quindi non vorrei creare un oggetto clonabile a meno che non ci fosse un requisito aziendale per esso.

3

Penso che il motivo per cui non riesci a trovare nulla sui vantaggi della clonazione è che il vantaggio è implicito: avere un (presumibilmente) modo semplice per creare un duplicato esatto dell'oggetto originale.

Ma sfortunatamente, il meccanismo di clonazione incorporato di Java tramite clone() e Cloneable presenta troppi svantaggi da considerare, principalmente in relazione alle implicazioni orribili che ha per il design delle classi. Josh Bloch ha un'intera sezione sul perché non si dovrebbe usare clone() o Cloneable nel suo libro Java efficace, sintetizzato brevemente in un interview.

Il consiglio generale è di utilizzare un costruttore di copie invece di usare clone() o Cloneable, sebbene sia ancora necessario decidere se una copia superficiale o profonda sia appropriata. Puoi anche utilizzare un'API di serializzazione come Serializable o JAXB, oltre a varie librerie di clonazione, per creare un clone profondo. È possibile trovare una discussione molto bella in una domanda correlata, Java: recommended solution for deep cloning/copying an instance.

0

Object.clone() ha molti problemi di progettazione ma è ancora il modo più popolare e più semplice di copiare oggetti. Alcuni vantaggi utilizzando clone() sono

  • E 'il modo più semplice per realizzare la clonazione, anche se per i progetti secolari, è sufficiente definire una classe genitore, implementare Cloneable in essa, fornire la definizione di clone() metodo e sei pronto ogni bambino del tuo genitore otterrà la funzione di clonazione.
  • La clonazione richiede una riga di codice molto inferiore, solo una classe astratta con un metodo di clone() lungo 4 o 5 righe se non si richiede la copia profonda.
  • La clonazione è il modo più veloce per copiare gli array.
  • A partire dalla versione 1.5, la chiamata di clone su un array restituisce un array il cui tipo di tempo di compilazione è uguale a quello dell'array clonato, il che significa chiaramente che il clone su array non richiede il cast di tipo.

Si può leggere di più su Java Cloning - Copy Constructor versus Cloning