Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    Clone

    Salve ragazzi ho un problema: allora io ho creato una classe che quando viene costruita prende tre valori che sono a loro volta classi :
    codice:
    public AI(Surface surface, Player player, Game game) {
    	    virtualGround =null;
    	    virtualPlayer = null;
    	    virtualGame = null;
        }
    Io vorrei che virtualGround sia la copia di surface, virtualPlayer di player e virtualGame di game.
    Ho letto su internet che dovrei fare così:
    codice:
    virtualGround=(Surface)surface.clone();
    ma anche così facendo mi copia il riferimento e dunque se faccio una modifica al virtualGround mi viene modificato anche il surface originale che gli passo.

    Sapete dirmi come fare?? Uso java 5.

    Ciao ciao

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Clone

    Originariamente inviato da JinKazama84
    Io vorrei che virtualGround sia la copia di surface, virtualPlayer di player e virtualGame di game.
    Ho letto su internet che dovrei fare così:
    codice:
    virtualGround=(Surface)surface.clone();
    ma anche così facendo mi copia il riferimento e dunque se faccio una modifica al virtualGround mi viene modificato anche il surface originale che gli passo.
    Ma la classe Surface implementa il clone??
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    si nella classe surface ho fatto implements Clonable

    e poi gli ho definito il metodo Clone che in pratica richiama super.clone()

    Non capisco perchè non va.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da JinKazama84
    si nella classe surface ho fatto implements Clonable

    e poi gli ho definito il metodo Clone che in pratica richiama super.clone()

    Non capisco perchè non va.
    La classe Surface ha variabili di istanza di tipo reference? Pure quelle vanno clonate! Altrimenti non ottieni una "deep-copy" completa.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    beh in effetti surface viene creata come matrice della classe che ho creato piece .. dunque che dovrei fare?? Non ho ben capito.

    Ti scrivo il costruttore di surface magari ti è più chiaro:
    codice:
    public Surface(int aL, int aH, int aN) {
    	checkConsistency(aL, aH, aN);
    	l = aL;
    	h = aH;
    	n = aN;
    	// crea l'array di piece vuoto
    	Piece[][] terreno = new Piece[l][h];
    	Random nmr = new Random();
    	for (int y = 0; y < h; y++) {
    	    for (int x = 0; x < l; x++) {
    		int valueType = nmr.nextInt(n); 
    		char type = possiblePieces[valueType];
    		Piece pezzo = new Piece(type);
    		terreno[x][y] = pezzo;
    	    }
    	}
    	ground = terreno;
        }

  6. #6
    Novità:

    ho capito cosa intendevi dire allora ho fatto questo nella surface:
    codice:
    public Object clone() {
    	try {
    	    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();
    	    }
    	    return cloned;
    	} catch (CloneNotSupportedException e) {
    	    // non succede mai perché implementiamo Cloneable
    	    return null;
    	}
        }
    Chiaramente Piece lo fatta clonaeble e ci ho definito il medoto super.clone()

    Così fatta mi viene creato un oggetto cloned che ha id diverso dall'originale un ground che ha id diverso mentre ogni elemento del ground rimane invariato. La cosa che non capisco e che ho fatto il doppio for per clonare ogni elemento visto che se funge per ground e surface dovrebbe funzionare anche per i singoli elementi.. invece no .. quando si aggiornano i singoli elementi di cloned.ground viene aggiornato l'id anche nell'originale.. Com'è possibile?

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    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).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Con questo cosa vuoi dirmi che non mi posso clonare gli elementi??
    Dunque mi attacco?? Non c'è soluzione??

    Io mi sono perso .. :berto: :berto:

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da JinKazama84
    Con questo cosa vuoi dirmi che non mi posso clonare gli elementi??
    Dunque mi attacco?? Non c'è soluzione??

    Io mi sono perso .. :berto: :berto:
    Devi fare tu la clonazione degli array più interni e quindi poi degli oggetti.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Non mi è chiaro .. scusa io facendo :

    cloned.ground[x][y]=(Piece)ground[x][y].clone();

    non clono l'array più interno??
    Quando faccio quell'istruzione qualcosa cambia; infatti se all'inizio l'id del PIECE clonato è 69 dopo diventa 80 ma il problema è che cambia anche quello originario.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.