Tieni presente una cosa: gli array implementano Cloneable ma un clone su un array bidimensionale clona solo la prima dimensione!!!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();
Questo programmino:
Stampa: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 ("--------"); } }
Cosa vuol dire? Nota le parti sottolineate: ha clonato solo l'array principale ma non il resto.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 --------
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).

Rispondi quotando