Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    CopyConstructor in Java

    Ciao,
    in C++ so che ci sono i copyconstructor. In Java da quanto ne so, no.
    Vi posto un semplice codice:

    codice:
    Award aw = new Award("path");
    Award b = aw;
    b.setAwardPath("ciao");
    System.out.println(aw.getAwardPath());
    L'output di ciò ovviamente è "ciao", dato che sia b che aw puntano allo stesso oggetto. Come faccio in Java a fare una copia (deep copy) di un oggetto? In questo caso, visto che sono stringhe potrei definire un costruttore del tipo:

    codice:
    puclic Award(Award anAward){
     this.award = anAward.getPath();
    }
    ed usarlo:
    codice:
    Award aw = new Award("path");
    Award b = new Award(aw);
    b.setAwardPath("ciao");
    System.out.println(aw.getAwardPath());
    in questo caso l'output sarebbe "path".
    Ma se ho un oggetto complesso? Esiste forse qualche classe o methodo?

  2. #2

    Re: CopyConstructor in Java

    Originariamente inviato da emaborsa
    Ma se ho un oggetto complesso? Esiste forse qualche classe o methodo?
    Si, l'interfaccia Cloneable.
    In sostanza, si implementa tale interfaccia e si sovrascrive il metodo Object.clone().

  3. #3
    Un copy constructor te lo puoi anche scrivere da te in java facendo in modo che si occupi di clonare opportunamente tutti i campi e sottocampi dell'oggetto, del resto anche implementando clonable hai da scrivere il codice per la copia a manina perché si tratta di un'interfaccia. In più clonable ha lo svantaggio di obbligarti a fare un cast esplicito.
    La seguente pagina di wikipedia espone abbastanza bene le varie alternative e i loro pro e contro, tra le altre parla anche di serializzare e deserializzare gli oggetti per ottenerne una copia.
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  4. #4
    ...domanda, solo per i tipi primitivi posso fare un semplice assegnamento vero? Dato che le stringhe sono pure Oggetti, l'esempio che ho fatto sopra non funziona.
    Dovrei fare:

    codice:
    puclic Award(Award anAward){
     this.award = new String(anAward.getPath());
    }
    o sbaglio?

  5. #5
    Originariamente inviato da emaborsa
    ...domanda, solo per i tipi primitivi posso fare un semplice assegnamento vero? Dato che le stringhe sono pure Oggetti, l'esempio che ho fatto sopra non funziona.
    Dovrei fare:

    codice:
    puclic Award(Award anAward){
     this.award = new String(anAward.getPath());
    }
    o sbaglio?
    Non sbagli
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  6. #6
    Originariamente inviato da emaborsa
    ...domanda, solo per i tipi primitivi posso fare un semplice assegnamento vero? Dato che le stringhe sono pure Oggetti, l'esempio che ho fatto sopra non funziona.
    Dovrei fare:

    codice:
    puclic Award(Award anAward){
     this.award = new String(anAward.getPath());
    }
    o sbaglio?
    Non è necessario, perchè gli oggetti String sono immutabili.
    Infatti, in questo esempio:
    codice:
    public class Award {
        public String s;
    
        public Award(Award aw) {
        	this.s = aw.s;
        }
        
        public Award(String s){
        	this.s = s;
        }
    
        public static void main(String[] args) {
            Award a = new Award("ciao");
            Award b = new Award(a);
            System.out.println("a : " + a.s);
            System.out.println("b : " + b.s);        
            b.s = a.s.concat(" e").concat(" arrivederci"); // qui vengono generate 2 istanze, la seconda verrà riferita da b.s
            System.out.println("a : " + a.s);
            System.out.println("b : " + b.s);
        }
    }
    ottieni l'effetto che desideri.
    Cioè, modifichi l'istanza b senza che venga modificata anche a.

  7. #7
    E' vero,ha ragione VincenzoTheBest, mi ero scordato di questa simpatica proprietà delle stringhe di fare eccezione.
    In ogni modo ho sempre usato la forma che ti ho esemplificato trattando una stringa come un oggetto qualunque,trovo poco ortodosse queste eccezioni alle regole seguite da tutti gli oggetti.
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  8. #8
    Originariamente inviato da unomichisiada
    mi ero scordato di questa simpatica proprietà delle stringhe di fare eccezione.
    Dache dhe pure io non ne ero più sicuro, nel frattempo l'ho scritto tutto facendo this.award = new String(anAward.getPath());. Poco importa, l'importante è che funzioni....e in effetti funziona.

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.