View Full Version : [JAVA] clonare vector
blackskop
22-09-2008, 11:38
Salve, vorrei clonare un vector di oggetti utilizzando soltanto il metodo clone direttamente sul vector (se è possibile!). Questo codice non funziona
import java.awt.Point;
import java.util.Vector;
public class Main {
public static void main(String[] args) {
MyPoint p1 = new MyPoint(1, 2);
MyPoint p2 = new MyPoint(2, 2);
MyPoint p3 = new MyPoint(3, 3);
Vector<MyPoint> points = new Vector<MyPoint>();
points.add(p1);
points.add(p2);
points.add(p3);
Vector<MyPoint> cloned = (Vector<MyPoint>) points.clone();
points.elementAt(0).setLocation(4, 4);
System.out.println(cloned.elementAt(0));
}
}
class MyPoint extends Point implements Cloneable {
private static final long serialVersionUID = 1L;
public MyPoint(int x, int y) {
super(x, y);
}
public Object clone() {
return super.clone();
}
}
Il punto dovrebbe avere coordinate (1, 1)...
se non erro il metodo clone() di vector non effettua una copia profonda. credo proprio che tu debba clonare tutti gli oggetti contenuti nel vector uno a uno.
ciao!
british
Salve, vorrei clonare un vector di oggetti utilizzando soltanto il metodo clone direttamente sul vector (se è possibile!).
Idomeneo
22-09-2008, 15:51
Effettivamente dev'essere così.
Però, d'altro canto, guardando sulla API(cliccami) (http://java.sun.com/javase/6/docs/api/java/util/Vector.html#clone()) dice testualmente:
"Returns a clone of this vector. The copy will contain a reference to a clone of the internal data array, not a reference to the original internal data array of this Vector object." :read:
Quindi non ho proprio idea del perché! :confused:
Idomeneo
banryu79
22-09-2008, 17:10
Prova a definire il metodo clone di MyPoint così:
public Object clone() {
return new MyPoint(this.x, this.y);
}
blackskop
22-09-2008, 17:16
Prova a definire il metodo clone di MyPoint così:
public Object clone() {
return new MyPoint(this.x, this.y);
}
Nada, a quanto pare il clone su vector non chiama il clone degli oggetti contenuti nel vector :(
banryu79
22-09-2008, 17:47
Ok, niente da fare, chiamare clone() non ti farà mai ottenere una deep copy degli oggetti contenuti nel tuo Vector, ma solo una shallow copy.
Non hai molte alternative se non creare un nuovo Vector e copiare(clonare) ogni singolo elemento.
Forse può interessarti questa (http://www.artima.com/intv/bloch13.html) spiegazione.
Qui poi c'è un altro articolo (http://javatechniques.com/blog/faster-deep-copies-of-java-objects/) al riguardo.
Idomeneo
22-09-2008, 17:49
Nada, a quanto pare il clone su vector non chiama il clone degli oggetti contenuti nel vector :(
Sì, evidentemente crea un Vector nuovo di zecca, ma gli oggetti interni puntati rimangono esattamente gli stessi.
Per sfizio ho provato ad inserire nel main del codice
if (cloned.elementAt(0) == points.elementAt(0) )
System.out.println("YES");
E indovinate cosa ha stampato? :p
Oggi ho imparato una cosa nuova, non mi posso fidare completamente neanche delle API! Grazie blackstop :D
Idomeneo
Mazzulatore
22-09-2008, 18:09
Effettivamente dev'essere così.
Però, d'altro canto, guardando sulla API(cliccami) (http://java.sun.com/javase/6/docs/api/java/util/Vector.html#clone()) dice testualmente:
"Returns a clone of this vector. The copy will contain a reference to a clone of the internal data array, not a reference to the original internal data array of this Vector object." :read:
Quindi non ho proprio idea del perché! :confused:
Idomeneo
C'è scritto la copia punta ad un array interno clone dell'originale, che contiene tutti i reference ad ogni oggetto, non gli oggetti uno ad uno.
Perchè puoi così trattare separatemente i due vettori, cancellare un elemento da uno e mantenere l'altro intatto ad esempio.
Idomeneo
22-09-2008, 18:20
C'è scritto la copia punta ad un array interno clone dell'originale, che contiene tutti i reference ad ogni oggetto, non gli oggetti uno ad uno.
Perchè puoi così trattare separatemente i due vettori, cancellare un elemento da uno e mantenere l'altro intatto ad esempio.
Grazie per avermi chiarito questa cosa allora :)
Idomeneo
blackskop
23-09-2008, 09:40
Sì, evidentemente crea un Vector nuovo di zecca, ma gli oggetti interni puntati rimangono esattamente gli stessi.
Per sfizio ho provato ad inserire nel main del codice
if (cloned.elementAt(0) == points.elementAt(0) )
System.out.println("YES");
E indovinate cosa ha stampato? :p
Oggi ho imparato una cosa nuova, non mi posso fidare completamente neanche delle API! Grazie blackstop :D
Idomeneo
L'ho imparato anche io, anche alla sun fanno copia incolla :D Grazie a te :D
blackskop
23-09-2008, 09:50
C'è scritto la copia punta ad un array interno clone dell'originale, che contiene tutti i reference ad ogni oggetto, non gli oggetti uno ad uno.
Perchè puoi così trattare separatemente i due vettori, cancellare un elemento da uno e mantenere l'altro intatto ad esempio.
Hai ribaltato il significato, la traduzione è esattamente il contrario.
blackskop
23-09-2008, 09:53
Ah no no mi sbaglio, c'è un "array data" di troppo :muro:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.