Newsgroup: it.comp.java
Titolo: "copiare" un oggetto

Se ho 2 oggetii uguali (o un oggetto ed un puntatore ad un altro oggetto 
identico) come faccio a copiare il contenuto delle variabili di un 
oggetto nell'altro?
Se faccio una cosa del genere faccio solo puntare il puntatore del primo 
oggetto al secondo giusto? non copio i valori contenuti in p.documento 
in nuovoOggetto.
Documento nuovoOggetto = new Documento();
nuovoOggetto=p.documento;  //p è un puntatore ad un oggetto che 
contiene 			     un oggetto documento (classe Documento)

 oggetto nell'altro?
E di appena ieri un thread "Come duplicare un oggetto".
Prendi il metodo clone() della classe Object, leggi la relativa 
documentazione per toglierti i dubbi sul funzionamento.

 documentazione per toglierti i dubbi sul funzionamento.
Si infatti l'ho visto dopo... ho provato ad usare clone() ma mi 
restituisce questo errore: clone() has protected access in java.lang.Object
Documento nuovoOggetto;
nuovoOggetto = p.documento.clone();
Ed in + mi dice anche che Object e documento sono incompatibili... devo 
fare anche un casting?

*Fabio* ha scritto:

clone è protected, infatti, e restituisce un object, almeno fino a java 
1.5, quindi serve il cast

 restituisce questo errore: clone() has protected access in java.lang.Object
La classe deve implementare Cloneable, inoltre deve fornire un accesso 
pubblico di clone().
Tutto spiegato sui javadoc di Object.clone(), come dicevo.

 Tutto spiegato sui javadoc di Object.clone(), come dicevo.
Si ho aggiunto anche che la classe Documento implents Cloneable ma per 
fornire un accesso pubblico a clone() come dici tu cosa devo fare? Devo 
creare un nuovo metodo clone() che faccia riferimento a clone di Object??

Ok ho sistemato anche il metodo clone() in questo modo:
public Object clone()
   {
     Object o = null;
     try
     {
       o = super.clone();
     }
     catch(CloneNotSupportedException e)
     {
        System.err.println("Errore in clone");
     }
        return o;
   }
Il problema č che non funziona...
Documento nuovoCentroide;
nuovoCentroide = (Documento)p.documento.clone();
Faccio una prova cosě:
nuovoCentroide.testa.ripetizioni++;
System.out.println("#" + nuovoCentroide.testa.ripetizioni + " - " + 
p.documento.testa.ripetizioni);
ed i due valori risultano uguali... cioč quando aumento uno aumenta 
anche l'altro... il che vuol dire che nuovoCentroide punta a p.documento 
e non č una sua copia.... :(

Capito dove sta il problema! Non avevo preso in considerazioni che testa 
era un riferimento!

    }
Se la tua superclasse è Object il try-catch è inutile, ovviamente Object
supporta la clonazione quindi non lancerà mai l'eccezione, in più così
non risolvi niente perché il clone() di Object non copia quello che ti 
serve.
All'interno del tuo metodo clone devi creare un nuovo oggetto Documento e
impostargli tutti i campi con i valori del documento corrente e restituire
quello. Capito?
public Object clone() throws CloneNotSupportedException {
	Documento d = new Documento();
	d.set(....);
	// setti i valori
	return d;
}
Se la classe Documento e tutte le classi che utilizzi nei metodi
set implementano Cloneable anche qui l'eccezione
CloneNotSupportedException non sarà mai lanciata.
-- 
Pietro	- 
http://www.pietroweb.tk
Linux Registered User #304991
Powered by MDK Linux Kernel 2.6.10