A klónozási módszer és a klónozható felület - 1

– 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…"