– Szia Amigo!
– Szia, Kim.
– Mesélek neked a klón() módszerről.
"Ennek a módszernek az a lényege, hogy klónozzon egy objektumot, vagy más szóval létrehozza az objektum klónját/másolását/másolatát."
"A metódus meghívásakor a Java virtuális gép létrehozza és visszaadja a meghívott objektum másolatát.
Az Object osztály klónozási módszerének megvalósítása nagyon primitív: csak egy új objektum jön létre, és az eredeti objektum mezőinek értékei hozzárendelődnek a mezőihez.
Ha a másolt objektum hivatkozásokat tartalmaz más objektumokra, akkor ezek a hivatkozások másolásra kerülnek. Ezekről az objektumokról nem jön létre másolat."
"Hmm. Nem sok a folytatás."
"Az a helyzet, hogy a Java virtuális gép nem tudja, mely objektumok klónozhatók és melyek nem. Például a fájlok nem klónozhatók. Ugyanez igaz a System.in adatfolyamra is."
"Tehát a teljes értékű klónozás kérdését egy osztály fejlesztői elé terjesztették. "Ez mind hasonló ahhoz, ahogyan az egyenlőség módszert kezelik. Még valami hasonló a hashCode-hoz: a klónozható felület."
„A klónozható felület az úgynevezett „jelölő interfész”: nincs semmilyen metódusa, és bizonyos osztályok megjelölésére szolgál.
"Ha egy osztály fejlesztője úgy véli, hogy az osztály objektumai klónozhatók, akkor ezzel a felülettel jelöli meg (vagyis klónozhatóvá teszi az osztályt)."
"Ha a fejlesztőnek nem tetszik a klónozási módszer szabványos megvalósítása, meg kell írnia a sajátját, amely a megfelelő módon duplikált objektumot hoz létre."
"A klón () metódus meghívásakor a Java ellenőrzi, hogy az objektum támogatja-e a klónozható felületet. Ha igen, akkor a klón () metódussal klónozza az objektumot ; ha nem, akkor CloneNotSupportedException-t dob."
"Más szóval, vagy felül kell írni a klónozási metódust, vagy klónozhatóvá kell tenni az osztályt?
"Igen, de még mindig felül kell írni a metódust. A clone() metódus védettnek van deklarálva, így csak a csomagjában (java.lang.*) lévő osztályok vagy azok alosztályai hívhatják meg."
– Kicsit össze vagyok zavarodva – szóval mit kell tennem egy objektum klónozásához?
"Ha az Object osztály «alapértelmezett» klónozási módszerét szeretné használni, akkor a következőket kell tennie:
" a) Adja hozzá a klónozható felületet az osztályához"
" b) Írja felül a klónozási metódust, és hívja meg a szuperosztály megvalósítását a megvalósításon belül:"
class Point implements Cloneable
{
int x;
int y;
public Object clone()
{
return super.clone();
}
}
"Vagy megírhatja a klónozási módszer megvalósítását teljesen egyedül:"
class Point
{
int x;
int y;
public Object clone()
{
Point point = new Point();
point.x = this.x;
point.y = this.y;
return point;
}
}
"Ez egy érdekes módszer. Biztos vagyok benne, hogy használni fogom. Alkalmanként…"
GO TO FULL VERSION