|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Aug 2005
Città: Monza
Messaggi: 2073
|
[Java] metodo clone
ciao a tutti, ho un lapsus ...
per clonare un'oggetto, cioè restituire un'istanza della medesima classe con i campi valorizzati con i medesimi contenuti, è sufficiente effettuare l'override del motodo clone() in questo modo Codice:
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
o devo campo per campo assegnare i dati a un nuovo oggetto e restituire quello ??
__________________
In Omnia Paratus - Improvvisare, Adattarsi, Raggiungere lo scopo XboxLive: WhiteWolf56933, PSN: WhiteWolf056933, Steam:WhiteWolf056933 |
|
|
|
|
|
#2 |
|
Member
Iscritto dal: Sep 2007
Messaggi: 207
|
Codice:
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Aug 2005
Città: Monza
Messaggi: 2073
|
spiegati meglio per favore ...
__________________
In Omnia Paratus - Improvvisare, Adattarsi, Raggiungere lo scopo XboxLive: WhiteWolf56933, PSN: WhiteWolf056933, Steam:WhiteWolf056933 |
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Sep 2007
Messaggi: 207
|
certo scusami ma prima di entrare nel dettaglio ho preferito fare delle prove per non dirti qualche cacchiata
allora abbiamo una classe Persona : Codice:
public class Persona implements Cloneable{
String nome;
String cognome;
int eta;
Cane cagnolino = new Cane("mio"); // per default si chiama mio il cane
public Persona(String nome, String cognome, int eta) {
this.nome = nome;
this.cognome = cognome;
this.eta = eta;
}
public Object clone(){
try{
return super.clone(); //richiamato il clone di object
}catch(CloneNotSupportedException e){
return null;
}
}
}
Codice:
public class mainClass {
public static void main(String args[]){
Persona marco = new Persona("Marco","Distrutti",20);
Persona claudio = (Persona)marco.clone();
claudio.cagnolino.nome = "ops";
System.out.println(marco.cagnolino.nome + " " + claudio.cagnolino.nome);
}
}
per sicurezza qui c'e' una buona spiegazione http://www.dis.uniroma1.it/~liberato...one/clone.html EDIT: in pratica i due oggetti clonati condividono gli stessi riferimenti ad attributi oggetto Ultima modifica di m.distrutti : 13-03-2008 alle 17:11. |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Aug 2005
Città: Monza
Messaggi: 2073
|
ok, grazie ... ma porca *** che palle ... !!! e tranquillamente sulla JDK c'è scritto l'opposto !!! mmm che nervi !!! vabbhe ... vado di reflection e via marciare !!!
__________________
In Omnia Paratus - Improvvisare, Adattarsi, Raggiungere lo scopo XboxLive: WhiteWolf56933, PSN: WhiteWolf056933, Steam:WhiteWolf056933 |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
basta ridefinire il metodo clone per chiamare ricorsivamente il clone sui membri di tipo reference (come scritto nella doc della classe java.lang.Object) Ultima modifica di mad_hhatter : 13-03-2008 alle 18:11. |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7262
|
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Aug 2005
Città: Monza
Messaggi: 2073
|
riguardando bene (con il supporto di un colega che inglese lo mastica a go go) effettivamente la spiegazione è più chiara ... cmq abbastanza fuorviante ...
vabbhe ... poco importa ... cmq con un po' di reflection ho ovviato al problema ... per info collettiva posto il codice .. Codice:
hidden
__________________
In Omnia Paratus - Improvvisare, Adattarsi, Raggiungere lo scopo XboxLive: WhiteWolf56933, PSN: WhiteWolf056933, Steam:WhiteWolf056933 Ultima modifica di WhiteWolf42 : 14-03-2008 alle 11:00. |
|
|
|
|
|
#9 | |
|
Member
Iscritto dal: Sep 2007
Messaggi: 207
|
Quote:
|
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Aug 2005
Città: Monza
Messaggi: 2073
|
ovviamente ... anche perchè una clonazione superficiale è una cagata ... basta fare un banale assegnamento ... quello che volevo ottenere io erano 2 istanze reali e distinte con campi contenenti i medesimi valori !!
__________________
In Omnia Paratus - Improvvisare, Adattarsi, Raggiungere lo scopo XboxLive: WhiteWolf56933, PSN: WhiteWolf056933, Steam:WhiteWolf056933 |
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7262
|
Quote:
l'errore è che basta chiamare setProperty solo se il campo è di tipo primitivo, mentre se si tratta di un tipo reference devi a sua volta clonarlo prima dell'assegnamento. da qui il nome: clonazione profonda di solito comunque non conviene creare un metodo generico, ma semplicemente si fa l'override del metodo clone e si implementa la clonazione profonda specifica per la classe in questione Ultima modifica di k0nt3 : 14-03-2008 alle 11:15. |
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Aug 2005
Città: Monza
Messaggi: 2073
|
c'è un problemino ... io devo "mappare" una serie di tabelle di un db (come orami penso sia evidente) ... il problema è che le tabelle sono 87 ... e qualla che ha meno campi ne ha 12 ... come puoi immaginare ... non passerebbe più ... e poi, in caso di modifica alla struttura del DB dovrei fare un lavoraccio ... e tanti saluti alla riusabilità del codice e alla filosofia object oriented ....
__________________
In Omnia Paratus - Improvvisare, Adattarsi, Raggiungere lo scopo XboxLive: WhiteWolf56933, PSN: WhiteWolf056933, Steam:WhiteWolf056933 |
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7262
|
Quote:
solo una cosa.. perchè è importante clonare gli oggetti nel tuo caso? |
|
|
|
|
|
|
#14 | ||
|
Senior Member
Iscritto dal: Aug 2005
Città: Monza
Messaggi: 2073
|
Quote:
Quote:
__________________
In Omnia Paratus - Improvvisare, Adattarsi, Raggiungere lo scopo XboxLive: WhiteWolf56933, PSN: WhiteWolf056933, Steam:WhiteWolf056933 |
||
|
|
|
|
|
#15 | |||
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7262
|
Quote:
tutto questo ovviamente se non usi la persistenza di JavaEE (vedi hibernate), forse per una struttura così complessa non pensata per JavaEE è un pò complicato. Quote:
|
|||
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Aug 2005
Città: Monza
Messaggi: 2073
|
il problema è che dobbiamo ridurre al minimo indispensabile gli accessi al DB ... sono mole di dati enormi. per caricare un flusso ci fogliono 10/15h ... quindi bisogna ottimizzare al massimo il programma ... cmq lavoretto da 10 minuti con ultraedit ed è fatta ... si, ma che soluzione di merda ...
ah ... piccolo dettaglio che mi era sfuggito ... sn sulla jdk 1.4 PS: lasciamo stare ... qui standard 0, analisi funzionale -2, informazioni ... -100
__________________
In Omnia Paratus - Improvvisare, Adattarsi, Raggiungere lo scopo XboxLive: WhiteWolf56933, PSN: WhiteWolf056933, Steam:WhiteWolf056933 |
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7262
|
se bisogna ridurre al minimo gli accessi al db allora si potrebbe usare un pattern di tipo proxy (che gestisce le letture e le scritture in maniera asincrona e mantiene una cache dei dati). ma qui mi sa che ti rimane il problema di clonare gli oggetti
potrebbe interessarti questa tecnica: http://en.wikipedia.org/wiki/Copy-on-write e quest'altra per la deep copy: http://javatechniques.com/blog/faste...-java-objects/ http://www.javaworld.com/javaworld/j...76.html?page=1 |
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Aug 2005
Città: Monza
Messaggi: 2073
|
impossibile effettuare lettura asincrona per un problema di cui non te ne parlo perchè mi vergogno aver implementato codice così !!!
__________________
In Omnia Paratus - Improvvisare, Adattarsi, Raggiungere lo scopo XboxLive: WhiteWolf56933, PSN: WhiteWolf056933, Steam:WhiteWolf056933 |
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7262
|
Quote:
quando si lavora con strumenti del genere non è facile arrivare a una soluzione elegante ps. perchè usi ultraedit e non eclipse per esempio? |
|
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Aug 2005
Città: Monza
Messaggi: 2073
|
uso eclipse (se no sarebbe da spararsi), UE lo uso per formattare meglio del testo, ha degli strumenti di formato e registrazione delle macro molto utili ...
__________________
In Omnia Paratus - Improvvisare, Adattarsi, Raggiungere lo scopo XboxLive: WhiteWolf56933, PSN: WhiteWolf056933, Steam:WhiteWolf056933 |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:22.




















