Oggetti mutabili final

di il
7 risposte

Oggetti mutabili final

Ciao a tutti, ho creato una classe Punto

public class Punto {
	private double x;
	private double y;
	
	public Punto() { // costruttore di default
		x=0;
		y=0;
	}
	
	public Punto(double x,double y) {
		this.x=x;
		this.y=y;
	}
	
	public Punto(Punto p) {
		this.x=p.x;
		this.y=p.y;
		
	}
        public void sposta(x,y) {
               this.x=x;
               this.y=y;
       }
}
l'oggetto è mutabile in quanto il metodo sposta non crea un nuovo oggetto Punto ma modifica l'oggetto chiamante.

se nel main scrivo:
final Punto p=new Punto(3,3);
come mai se scrivo
 p.sposta(0,0); 
l'oggetto viene modificato pur essendo final?

poi ho scritto anche questa classe Triangolo:

public class Triangolo {
	// per costruire un triangolo abbiamo bisogno di 3 punti non allineati
	private Punto p1,p2,p3; // vertici
	private double a,b,c;  // lati
	
	public Triangolo(Punto p1, Punto p2, Punto p3) {
		a=p1.distanza(p2);
		b=p2.distanza(p3);
		c=p3.distanza(p1);
		
		if(( a>=b+c ) || ( b>=a+c ) || ( c>=a+b )) {
			System.out.println("Il Triangolo non esiste");
			System.exit(-1);
		}
		
		this.p1=new Punto(p1);	
		this.p2=new Punto(p2);	
		this.p3=new Punto(p3);
	}
	
	public Triangolo(Triangolo t) {
		this.p1=t.p1;	this.a=t.a;
		this.p2=t.p2;	this.a=t.b;
		this.p3=t.p3;	this.c=t.c;
	}
quello che mi domando adesso è per pura curiosità:

nel costruttore di copia public Triangolo(Triangolo t)
cosa cambia se scrivo:
this.p1=t.p1;
oppure
this.p1=new Punto(t.p1);
cioè anche se i punti sono in aliasing i triangoli non lo sono e inoltre non c'è modo di modificare i triangoli perchè non si possono modificare i punti

7 Risposte

  • Re: Oggetti mutabili final

    Dunque la risposta alla prima domanda penso che tu possa trovarla . Sostanzialmente ciò che è immutabile nel tuo caso è il reference (puntatore) e non l'oggetto in sé.

    Riguardo la seconda domanda ciò che cambia è che se usi il costruttore da te definito allora il nuovo oggetto "triangolo" avrà come vertici gli stessi oggetti "punto" che utilizza l'oggetto "t". Se utilizzi l'istruzione
    this.p1=new Punto(t.p1);
    allora per ogni vertice verrà creato un nuovo oggetto "punto" il cui contenuto, però, sarà identico a quello che è presente nell'oggetto "t". Quindi in pratica avrai due oggetti diversi ma identici.

    Perdonami ma non ho capito questa frase:
    cioè anche se i punti sono in aliasing i triangoli non lo sono e inoltre non c'è modo di modificare i triangoli perchè non si possono modificare i punti
  • Re: Oggetti mutabili final

    Infatti la frase è un po contorta,comunque la seconda risposta è stata molto chiara.
    Per quanto riguarda la prima:
    se scrivo:
    final Punto p=new Punto(1,1);
    Punto q=new Punto(2,2);
    io non posso scrivere ad esempio
    p=q; o p=new Punto(q);

    però posso scrivere:
    p.sposta(2,2); perchè final applicato ad un oggetto non lo rende immutabile.

    quindi per rendere immutabile Punto dovrei scrivere le variabili di istanza:
    private final x;
    private final y;

    però in questo caso il metodo sposta non avrebbe senso
  • Re: Oggetti mutabili final

    Esatto..comunque se vuoi creare un oggetto immutabile proprio il metodo "sposta" non ha tanto senso
  • Re: Oggetti mutabili final

    Grazie mille, comunque quello che volevo dire con quella frase era questo:
    se scrivo:
    Triangolo t=new Triangolo(p,q,r);
    e poi scrivo:
    Triangolo s=new Triangolo(t);
    se il costruttore Triangolo(Triangolo t) fosse così:
    this.p1=t.p1;
    ecc,ecc

    t e s sarebbero 2 triangoli con diversi riferimenti,ma i punti "puntano" agli stessi riferimenti.
    poichè non ho scritto metodi che possano mutare i triangoli in questo caso i triangoli rimarrebbero sempre così.

    se invece avessi scritto un metodo che riceve un vettore e mi trasla il triangolo (quindi mi dovrebbe spostare i punti) per come ho scritto il costruttore mutando ad esempio t muterebbe anche s.

    spero di essermi fatto capire meglio
  • Re: Oggetti mutabili final

    Si esatto in questo esempio è come dici tu
  • Re: Oggetti mutabili final

    Ok grazie 1000 per la disponibilità
  • Re: Oggetti mutabili final

    Di niente
Devi accedere o registrarti per scrivere nel forum
7 risposte