Costruttore di copia: sintassi e utilizzo?

di il
5 risposte

Costruttore di copia: sintassi e utilizzo?

Ciao a tutti, premetto che sono alle prime armi della programmazione con Java.

Spiego il mio dubbio attraverso un esempio, cercando di facilitare la comprensione:

All'interno di una classe "Punto2D" (punto in due dimensioni), che mi permette di definire un punto cartesiano di coordinate (x,y), voglio definire due costruttori:
1.Il primo che inizializzi l'oggetto "punto" con parametri espliciti;
2.Il secondo che faccia la stessa operazione, andando però a creare un oggetto diverso, creando quindi una nuova area di memoria.

La soluzione al "problema" è quella di creare un costruttore di copia (per ipotesi), quindi opero in questo modo (secondo quanto detto dal professore):

public class Punto2D {

//Campi di esemplare

private double x,y;

//Costruttore 1

public Punto2D (int x0, int y0) {
  x=x0;
  y=y0;
}

//Costruttore 2 di copia

public Punto2D (Punto2D p) {
  x=p.x;
  y=p.y;
}

}

Non riesco a capire che logica ci sia dietro la scrittura "Punto2D p" tra le parentesi e "p.x" e "p.y" nella definizione dei campi di esemplare.

In sostanza, qualcuno saprebbe spiegarmi come funziona un costruttore di copia e di che sintassi necessita?

Grazie mille

5 Risposte

  • Re: Costruttore di copia: sintassi e utilizzo?

    Giammarco ha scritto:


    La soluzione al "problema" è quella di creare un costruttore di copia (per ipotesi), quindi opero in questo modo (secondo quanto detto dal professore):

    private double x,y;

    //Costruttore 2 di copia

    public Punto2D (Punto2D p) {
    x=p.x;
    y=p.y;
    }
    Corretto (visto che lo stato non è immutabile, sarebbe però meglio usare dei metodi getter per prendere x/y da p).

    Il termine "costruttore di copia" è una espressione un po' informale che descrive un costrutto/sintassi che può creare un oggetto partendo dai dati di un altro oggetto dello stesso tipo.
    In altri linguaggi il concetto può essere più formalizzato a livello di linguaggio (mi pare in C++ ma ora vado a spanne).
    In Java il concetto di "costruttore di copia" non è formalizzato a livello di linguaggio. Insomma, Java non ne "sa" nulla di questo e non offre alcun costrutto o sintassi specifica per un costruttore di copia.
    A livello informale lo fai banalmente con un costruttore che ... guarda caso riceve un oggetto dello stesso tipo della classe!

    Giammarco ha scritto:


    Non riesco a capire che logica ci sia dietro la scrittura "Punto2D p" tra le parentesi e "p.x" e "p.y"
    Il Punto2D p tra parentesi è semplicemente un parametro .... né più né meno di un parametro di un metodo.
  • Re: Costruttore di copia: sintassi e utilizzo?

    andbin ha scritto:


    Corretto (visto che lo stato non è immutabile, sarebbe però meglio usare dei metodi getter per prendere x/y da p).
    Ma perché le scritture "p.x" e "p.y" sono equivalenti all'utilizzo di due metodi getter?

    Esse sono nella forma:
    nomeOggetto.nomeCampoDiEsemplare

    Io prima d'ora pensavo fosse possibile "prelevare" valori del campo di esemplare SOLO creando metodi getter, per questo non mi spiego come la stessa cosa possa avvenire anche attraverso l'utilizzo della sopracitata notazione.
  • Re: Costruttore di copia: sintassi e utilizzo?

    Giammarco ha scritto:


    Io prima d'ora pensavo fosse possibile "prelevare" valori del campo di esemplare SOLO creando metodi getter
    No, infatti.

    Giammarco ha scritto:


    per questo non mi spiego come la stessa cosa possa avvenire anche attraverso l'utilizzo della sopracitata notazione.
    Non comprendo il dubbio. Cioè ... è una cosa del linguaggio: se hai un reference ad un oggetto puoi fare principalmente 2 cose: accedere ad un campo dell'oggetto oppure invocare un metodo sull'oggetto.
    Chiaramente dipendentemente dalla accessibilità di campo/metodo.
  • Re: Costruttore di copia: sintassi e utilizzo?

    andbin ha scritto:


    se hai un reference ad un oggetto puoi fare principalmente 2 cose: accedere ad un campo dell'oggetto oppure invocare un metodo sull'oggetto.
    Chiaramente dipendentemente dalla accessibilità di campo/metodo.
    Ok perfetto, credo di avere intuito: posso richiamare un campo di un oggetto semplicemente facendo nomeOggetto.nomeCampoCheDesideroRichiamare. Chiaramente se non ho problemi di accessibilità particolari (ex. private).

    Esatto?

    Grazie mille
  • Re: Costruttore di copia: sintassi e utilizzo?

    Giammarco ha scritto:


    posso richiamare un campo di un oggetto semplicemente facendo nomeOggetto.nomeCampoCheDesideroRichiamare. Chiaramente se non ho problemi di accessibilità particolari (ex. private).
    Esatto. Tieni comunque presente che salvo casi davvero particolari, non è bene accedere direttamente ai campi degli oggetti. Si dovrebbero usare il più possibile metodi getter/setter.
    Accedendo direttamente ai campi, praticamente vai a sparpagliare l'accesso in tanti punti, non puoi fare controlli o logiche particolari e sostanzialmente non sfrutti il principio di "incapsulamento" (quello che in generale è il concetto di information hiding).
Devi accedere o registrarti per scrivere nel forum
5 risposte