Returnera en array, djupkopiering, grundkopiering
Antag att vi har en klassPP
som har en instansvariabel enligt följande:
private int [] x;
I klassen finns en metod
getX_Alt1
som returnerar arrayen x
. Den ser ut så här:
Returtypen för en metod står alltid före metodens namn. I detta fall står det
public int [] getX_Alt1() { return this.x; }
int []
, eftersom metoden skall returnera en int-array.
Följande exempel visar hur metoden kan anropas:
// Skapa ett PP-objekt p1 PP p1 = new PP(); ... // Gör något med p1 // Anropa metoden getX som returnerar arrayen x // Arrayen z kommer referera till samma array som x int [] z = p1.getX_Alt1();
x
och z
kommer att referera till samma array, dvs
om vi ändrar något i arrayen z
kommer det innebära att också
instansvariabeln x
kommer att ändras. Instansvariabeln x
och
z
är alias för samma array med element.
Om vi ändrar ett element i arrayen z
kommer det per automatik att innebära att instansvariabeln x
också ändras.Om vi gör
z[0]=14;
innebär det att instansvariabeln x
i PP
-objektet p1
får ett nytt värde, dvs x[0]=14;
.
Det är (normalt) inte önskvärt att man kan ändra ett objekt på detta sätt, eftersom det är via metoderna i en klass som man ändrar objektet. Om klassen har en metod som returnerararrayen skall den inte returnera referensen till arrayen, utan en array som är kopia av innehållet i arrayen. Metoden getX_Alt2
löser detta problem:
public int [] getX_Alt2() { // Skapa en array som är lika lång som instansvariabeln x int [] xcopy = new int[this.x.length]; // Kopiera elementens värden från x till xcopy for (int i=0;i < this.x.length;i++) { xcopy[i]=this.x[i]; } // Returnera xcopy return xcopy; }
Följande exempel visar hur metoden getX_Alt2
kan anropas:
Om vi nu gör:
// Skapa ett PP-objekt p1 PP p1 = new PP(); ... // Gör något med p1 // Anropa metoden getX_Alt2 som returnerar en array som // är kopia av instansvariabeln x // Arrayen z kommer INTE att referera till samma array som x int [] z = p1.getX_Alt2();
z[0]=14
kommer detta inte att påverka instansvariabeln x
.
Djupkopiering vs grundkopiering
- Metoden
getX_Alt2
är ett exempel på en metod som utför djupkopiering, ty den skapar en kopia av arrayenx
och returnerar kopian. Instansvariabelnx
är därmed skyddad. - Metoden
getX_Alt1
är ett exempel på en metod som utför grundkopiering, ty den kopierar bara referensen till arrayen och returnerar denna, vilket innebär att instansvariabelnx
är oskyddad.