Originariamente inviato da JinKazama84
codice:
Surface cloned = (Surface) super.clone();
cloned.ground = (Piece[][]) ground.clone();
for (int x=0;x<l;x++){
for (int y=0;y<h;y++)
cloned.ground[x][y]=(Piece)ground[x][y].clone();
Tieni presente una cosa: gli array implementano Cloneable ma un clone su un array bidimensionale clona solo la prima dimensione!!!
Questo programmino:
codice:
class Prova
{
public static void main (String[] args)
{
Object[][] biarr = { { new Object(), new Object() }, { new Object(), new Object() } };
printBiArr (biarr);
Object[][] biarr2 = biarr.clone ();
printBiArr (biarr2);
}
public static void printBiArr (Object[][] arr)
{
System.out.println (arr);
for (Object[] a1 : arr)
{
System.out.println (" " + a1);
System.out.print (" ");
for (Object o : a1)
System.out.print (o + " ");
System.out.println ();
}
System.out.println ("--------");
}
}
Stampa:
codice:
[[Ljava.lang.Object;@e48e1b
[Ljava.lang.Object;@12dacd1
java.lang.Object@1ad086a java.lang.Object@10385c1
[Ljava.lang.Object;@42719c
java.lang.Object@30c221 java.lang.Object@119298d
--------
[[Ljava.lang.Object;@f72617
[Ljava.lang.Object;@12dacd1
java.lang.Object@1ad086a java.lang.Object@10385c1
[Ljava.lang.Object;@42719c
java.lang.Object@30c221 java.lang.Object@119298d
--------
Cosa vuol dire? Nota le parti sottolineate: ha clonato solo l'array principale ma non il resto.
In pratica ha creato un nuovo array:
{ vecchio reference a Object[] , vecchio reference a Object[] }
ma il resto è identico all'array originale.
L'unico caso in cui il clone su un array fa veramente una "deep-copy" è nel caso particolare di array di tipi primitivi e a 1 dimensione. Per qualunque altro tipo di array la clonazione è "shallow".
Nota infine come da Java 5 in poi la clonazione sugli array è "covariante" (non ho fatto cast nel codice).