[java] Duplicare un Oggetto
Salve a tutti,
Quando provo a copiare un oggetto, quest'ultimo rimane dipendente dal primo, ovvero se modifico uno dei due, si modifica in ugual modo anche quell'altro... Ora ho letto su internet che esiste un procedimento per fare una copia indipendente di un oggetto, però io non ci capisco molto... C'è qualcuno che gentilmente mi potrebbe dare qualche dritta?
Quando provo a copiare un oggetto, quest'ultimo rimane dipendente dal primo, ovvero se modifico uno dei due, si modifica in ugual modo anche quell'altro... Ora ho letto su internet che esiste un procedimento per fare una copia indipendente di un oggetto, però io non ci capisco molto... C'è qualcuno che gentilmente mi potrebbe dare qualche dritta?









Risposte
Il metodo per farlo dovrebbe essere clone() ma non sono un esperto di java:
a = b.clone();
a = b.clone();
Ho provato a fare come dici tu e ho scritto:
.
.
Rubik cubo= Cubes.Perfect() ;
Rubik copia= cubo.clone();
.
.
e mi da questo errore:
E:\Uni\Java\Doctor Java\Rubik\TestRubik.java:5: clone() has protected access in java.lang.Object
.
.
Rubik cubo= Cubes.Perfect() ;
Rubik copia= cubo.clone();
.
.
e mi da questo errore:
E:\Uni\Java\Doctor Java\Rubik\TestRubik.java:5: clone() has protected access in java.lang.Object
Già, scusa. Andavo a memoria e clone è un oggetto protected e quindi non puoi usarlo in quel modo. Potresti implementare un metodo per la copia all'interno della classe, ma sono certo che ci siano modi migliori.
grazie per le risposte... pultroppo io non me ne intendo molto di java... riusciresti a farmi un semplice esempio?
Puoi semplicemente creare un metodo in cui crei una nuova istanza (usando new) della tua classe e poi inizializzi tutti i valori come nella tua classe. Ovviamente non è molto generale, ma non ho trovato molto su internet.
Ok proverò a dare un'occhiata allora e grazie!
PS: Se io avessi la classe seguente
public class Persona {
String nome;
String cognome;
int eta;
}
Cosa dovrei scrivere per duplicare ciccio:
Persona ciccio = new Persona();
ciccio.nome = "XXX";
ciccio.cognome = "YYY";
ciccio.eta = 0;
Persona ciccio_copia = ??????????
PS: Se io avessi la classe seguente
public class Persona {
String nome;
String cognome;
int eta;
}
Cosa dovrei scrivere per duplicare ciccio:
Persona ciccio = new Persona();
ciccio.nome = "XXX";
ciccio.cognome = "YYY";
ciccio.eta = 0;
Persona ciccio_copia = ??????????
"Optimus Prime":
Persona ciccio_copia = ??????????
Per copiare il valore di variabile in un'altra, basta e avanza la semplice istruzione di assegnamento (l'operatore uguale per intenderci). Di conseguenza per copiare il valore della variabile "ciccio" in "copiaCiccio" basta scrivere la seguente istruzione (posto che il resto del listato sia corretto e soprattutto posto che sia presente il metodo main):
Persona ciccioCopia = ciccio;
Si, ma così creo delle copie dipendenti l'una dall'altra...
devi fare qualcosa del genere (vado a memoria)
si, il java a volte è davvero stupido
edit: attenzione che questo ti fa una copia superficiale dell'oggetto, vale a dire se stai copiando un oggetto che contiene, tra le altre cose, riferimenti ad altri oggetti (ad esempio String), l'oggetto copiato conterrà riferimenti agli stessi oggetti!
esempio concreto:
hai una classe Cane che contiene i campi int anni e String nome.
se fai
le variabili a.anni e b.anni sono variabili diverse, mentre a.nome e b.nome, pur essendo anch'esse variabili diverse, puntano allo stesso oggetto String! Se vuoi fare una copia "profonda", per far puntare a.nome e b.nome a due oggetti String diversi devi ovviamente modificare in modo opportuno il metodo clone della classe Cane.
class Cubo implements Cloneable{ //altri metodi public static Object clone(){ try{ return super.clone(); } catch(CloneNotSupportedException e){ } } }
si, il java a volte è davvero stupido
edit: attenzione che questo ti fa una copia superficiale dell'oggetto, vale a dire se stai copiando un oggetto che contiene, tra le altre cose, riferimenti ad altri oggetti (ad esempio String), l'oggetto copiato conterrà riferimenti agli stessi oggetti!
esempio concreto:
hai una classe Cane che contiene i campi int anni e String nome.
se fai
Cane a=new Cane(10,"Pippo"); Cane b=a.clone();
le variabili a.anni e b.anni sono variabili diverse, mentre a.nome e b.nome, pur essendo anch'esse variabili diverse, puntano allo stesso oggetto String! Se vuoi fare una copia "profonda", per far puntare a.nome e b.nome a due oggetti String diversi devi ovviamente modificare in modo opportuno il metodo clone della classe Cane.
Il mio oggetto è composto da 6 matrici, 3 x 3, di caratteri.. quindi mi sa che dovrei fare una copia profonda come dici tu. Giusto? E se le matrici fossero composte da numeri, basterebbe una copia superficiale?
Approposito, io l'oggetto l'ho scritto così:
Approposito, io l'oggetto l'ho scritto così:
public class Rubik {
char[][] W;
char[][] O;
char[][] Y;
char[][] R;
char[][] B;
char[][] G;
}
Cosa intendi per "copia superficiale"??
Sostanzialmente, da quello che ho capito, con una copia superficiale si copia solo "l'indirizzo di memoria" dell'oggetto, quindi tutte le copie puntano alla stessa cosa.