martedì 3 luglio 2012

Java metodo clone ArrayList

Con questo metodo , che torna un Object , è possibile effettuare una cosiddetta "shallow copy" (copia superficiale) di un oggetto.
Quindi, in una situazione di questo tipo:

ArrayList<Person> lp=new ArrayList<Person>();
Person p=new Person("mario", "rossi");
Person p1=new Person("gino", "bianchi");
lp.add(p);
lp.add(p1);
ArrayList<Person> lp2=(ArrayList<Person>)lp.clone();
stampaPersone(lp);
stampaPersone(lp2);
p.setNome("Ermenegildo");
stampaPersone(lp);
stampaPersone(lp2);


Dove stampaPersone è un semplice metodo che stampa nome e cognome dell'oggetto Person, nella seconda tornata di stampe il nome della persona p sarà modificato per entrambe le liste, questo appunto perchè la copia è superficiale, non sono quindi ricreati gli oggetti.
Se dobbiamo quindi effettuare copie complete (deep copy) è necessario implementarci i nostri metodi ad hoc.
Da notare che per le Stringhe, che pure sono oggetti ma in java hanno un trattamento particolare (essendo immutabili), quanto visto non vale.

Quindi con il seguente codice:

ArrayList<String> l=new ArrayList<String>();
String u="uno";
l.add(u);
l.add("due");
l.add("tre");
ArrayList<String> clonata=(ArrayList<String>)l.clone();
clonata.add("quattro");
System.out.println("Stampa lista originale");
stampa(l);
System.out.println("Stampa lista clonata");
stampa(clonata);
u="akdajjda";
System.out.println("Stampa lista originale");
stampa(l);
System.out.println("Stampa lista clonata");
stampa(clonata);

Il fatto di aver assegnato un nuovo valore alla variabile u è ignorato dalle liste

Nessun commento:

Posta un commento