Java - Como clonar una matriz de objetos

 
Vista:
sin imagen de perfil

Como clonar una matriz de objetos

Publicado por Alex (2 intervenciones) el 13/11/2015 01:44:47
Hola buenas, me gustaría que me ayudaran con este problema, la cuestión es que tengo que clonar una superficie compuesta por una matriz de células, como vienen en las imágenes y en principio al mostrar la original y la copia parece estar bien, pero al modificar la original la copia también se modifica, cosa que no quiero, mi idea es que la copia no tenga cambios mientras recorro y modifico la original. Llevo mucho dándole vueltas y me parece que el código esta bien, lo único que dudo que este bien es la forma de clonar esa superficie, si me pueden ayudar seria genial. muchas gracias.
1-Celula
2-Superficie
3-uso
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

Como clonar una matriz de objetos

Publicado por Tom (1831 intervenciones) el 13/11/2015 23:08:01
Te has metido, en mi opinión, en un fregado que no merece la pena.
A mi entender, el problema principal lo tienes en Superficie.clone():

Primero creas un nuevo array para el clon independiente del original (copia.tablero = new Celula[filas][cols];) lo cual parece correcto ... pero un poco más abajo machacas ese mismo array (copia.tablero=(Celula[][])tablero.clone();).

Esta última asignación es la que vale (el primer array creado con new lo pierdes) y la que falla.

El método clone() para un array, devolverá un nuevo objeto array,, pero no clonará cada referencia contenida en él. Así que acabas con dos arrays distintos pero que referencian a los mismos objetos.

En tu caso no parece muy complicado hacer una copia "manual". En todo caso, la solución pasaría por algo así como:

1
2
3
4
5
6
7
8
9
10
11
12
public Superficie clone() {
  Superficie copia = (Superficie)super.clone();
 
  copia.tablero = new Celula[filas][cols];
 
  for(int f = 0; f < filas; f++) {
    for(int c = 0; c < cols; c++) {
      copia.tablero[f][c] = tablero[f][c].clone();
    }
  }
  return copia;
}

Al final casi te da lo mismo escribir un método copia() y olvidarte del clone() y el Cloneable; Y quedará más fácil de entender.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Como clonar una matriz de objetos

Publicado por Alex (2 intervenciones) el 14/11/2015 02:39:43
Si la verdad que tienes razón, tarde bastante en darme cuenta que con un método copia donde únicamente clone las células que voy encontrando es mas cómodo. Muchas gracias¡¡
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