Java - Problema al clonar

 
Vista:

Problema al clonar

Publicado por María (4 intervenciones) el 08/07/2009 10:39:15
Hola!

Tengo una clase Tablero que tengo definida así:

public class Tablero implements Cloneable{

ArrayList tablero;

public Tablero(ArrayList ini){
this.tablero = ini;
}

....................

public Object clone(){
Object tab = null;
try{
tab=super.clone();
}
catch(CloneNotSupportedException ex){
System.out.println(" no se puede duplicar");
}
return tab;


}

Mi otra clase llama de la siguiente forma dentro de un método a Tablero:
public ArrayList posiblesSoluciones (Problema problema){

// Copio el tablero:
Tablero table = (Tablero)problema.getTablero().clone();

// PRUEBA DE Q ES UNA COPIA INDEPENDIENTE!!!!!!!!
ArrayList f = new ArrayList();
((ArrayList)table.getFila(1)).set(0, "xxxxx");
table.ImprimirTablero();
System.out.println("...................................");
problema.getTablero().ImprimirTablero();


Es decir, modifico la copia y luego imprimo tanto la copia como el original. El caso es que me sale el original modificado!

Alguien me puede ayudar?

Gracias!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Problema al clonar

Publicado por James (207 intervenciones) el 08/07/2009 16:52:30
Pues esta mal el metodo clone, con simplemente llamar a la superclase no se hace nada mas que asignar de forma directa(no se clona), en realidad lo que debes hacer es crear un nuevamente una instancia y asignarle los datos, te pongo una clase mia como ejemplo:

public class DemoCloneable implements Cloneable {

private int value;
private ArrayList<String> data;

public DemoCloneable(int value, ArrayList<String> data) {
this.value = value;
this.data = data;
}

public int getValue() {
return value;
}

public void setValue(int value) {
this.value = value;
}

public ArrayList<String> getData() {
return data;
}

public void setData(ArrayList<String> data) {
this.data = data;
}

public void add(String value) {
this.data.add(value);
}

@Override
protected Object clone() throws CloneNotSupportedException {
//Voy clonando los valores uno a uno
ArrayList<String> dataClone = new ArrayList<String>();
int valueClone = this.value;
for (String s : this.data) {
dataClone.add(s);
}
DemoCloneable clone = new DemoCloneable(valueClone, dataClone);
return clone;
}

//Para comprobacion muestro los valores
@Override
public String toString() {
return "---------- DATOS EN LA CLASE -------------" + System.getProperty("line.separator") +
"- " + value + System.getProperty("line.separator") + data;
}
}

Bueno como veras en una calse muy simpe con un par de variables y ses respectivos metodos de encapsulamiento, el metodo clone va clonando los valores uno a uno como se supone, claro que en lo del ArrayList podias usar el clone que la clase ArrayList incluye, pero la idea es ejemplificar la clonacion de valores uno a uno, claro los que no sean clonables, sin son clonables pues usas el clone, el metodo toString solo esta para prueba del funcionmiento , por ultimo pongo una clase main para prueba del funcionamiento

public class Demo implements Cloneable{

public static void main(String[] args) throws CloneNotSupportedException {
ArrayList<String> data = new ArrayList<String>();
data.add("Ejemplo");
DemoCloneable demo = new DemoCloneable(154, data);
DemoCloneable clone = (DemoCloneable)demo.clone();
//Modifico la clonada
clone.setValue(demo.getValue() + 10 );
clone.add("Nuevo valor");
//Muesrto como quedo
System.out.println(demo);
System.out.println(clone);
}

}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar