[java] Duplicare un Oggetto

Optimus Prime
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? :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol:

Risposte
apatriarca
Il metodo per farlo dovrebbe essere clone() ma non sono un esperto di java:

a = b.clone();

Optimus Prime
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

apatriarca
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.

Optimus Prime
grazie per le risposte... pultroppo io non me ne intendo molto di java... riusciresti a farmi un semplice esempio?

apatriarca
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.

Optimus Prime
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 = ??????????

nicostyle86
"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;

Optimus Prime
Si, ma così creo delle copie dipendenti l'una dall'altra...

Simone Russo1
devi fare qualcosa del genere (vado a memoria)

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.

Optimus Prime
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ì:

public class Rubik {
char[][] W;
char[][] O;
char[][] Y;
char[][] R;
char[][] B;
char[][] G;

}

nicostyle86
Cosa intendi per "copia superficiale"??

Optimus Prime
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.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.