Mi chiedo se esiste un modo consigliato per eseguire il clone / copia di istanza in profondità in Java.
Ho in mente 3 soluzioni, ma potrei essermene perso alcune e vorrei avere la tua opinione
modifica: includi la proposta di Bohzo e affina la domanda: si tratta più della clonazione profonda che della clonazione superficiale.
Fallo da solo:
codificare manualmente le proprietà del clone dopo le proprietà e verificare che anche le istanze mutabili vengano clonate.
pro:
- controllo di ciò che verrà eseguito
-
contro esecuzione rapida :
- noioso da scrivere e mantenere
- soggetto a bug (errore copia / incolla, proprietà mancante, proprietà mutabile riassegnata)
Usa la riflessione:
Con i tuoi strumenti di riflessione o con un helper esterno (come i jakarta common-bean) è facile scrivere un metodo di copia generico che eseguirà il lavoro su una riga.
pro:
- facile da scrivere
- nessun
contro di manutenzione :
- minor controllo di ciò che accade
- bug soggetto a oggetto mutabile se lo strumento di riflessione non clona troppo gli oggetti secondari
- esecuzione più lenta
Usa framework clone:
Usa un framework che lo faccia per te, come:
commons-lang SerializationUtils
Java Deep Cloning Library
Dozer
Kryo
pro:
- lo stesso della riflessione
- maggiore controllo su ciò che sarà esattamente clonato.
contro:
- ogni istanza mutabile è completamente clonata, anche alla fine della gerarchia
- potrebbe essere molto lenta da eseguire
Utilizzare la strumentazione bytecode per scrivere clone in fase di esecuzione
javassit , BCEL o cglib potrebbero essere utilizzati per generare un cloner dedicato con la stessa velocità con cui è stata scritta una mano. Qualcuno conosce una lib usando uno di questi strumenti per questo scopo?
Cosa mi sono perso qui?
Quale consiglieresti?
Grazie.