Java clone-deep and shallow copy-copy constructors

a clone is an exact copy of the original. A java-ban lényegében azt jelenti, hogy képes létrehozni egy olyan objektumot, amely hasonló állapotban van, mint az eredeti objektum. A Java clone() módszer biztosítja ezt a funkciót.

ebben a bejegyzésben megvizsgáljuk a Java klón legfontosabb aspektusait.

Table of Contents1. What is clone?2. Java Cloneable interface and clone() method3. Shallow Copy4. Deep Copy5. Java Copy Constructors6. Deep copy with serialization7. Cloning using Apache commons8. Java clone best practices

mi a Java klón?

tehát a klónozás az eredeti objektum másolatának létrehozásáról szól. A szótár jelentése : “készíts egy azonos példányt”.

alapértelmezés szerint a java klónozás “mezőről mezőre másolás”, azaz mivel az Objektumosztálynak nincs ötlete az osztály szerkezetéről, amelyre a klón() metódust meghívják.

So, JVM amikor klónozásra van szükség, tegye a következő dolgokat:

  1. Ha az osztálynak csak primitív adattípus-tagjai vannak, akkor az objektum teljesen új példánya jön létre, és az új objektum másolatára való hivatkozás visszatér.
  2. Ha az osztály bármely osztálytípus tagjait tartalmazza, akkor csak az adott tagokra vonatkozó objektumhivatkozások kerülnek másolásra, így a taghivatkozások mind az eredeti objektumban, mind a klónozott objektumban ugyanarra az objektumra utalnak.

eltekintve a fenti alapértelmezett viselkedés, akkor mindig felülbírálja ezt a viselkedést, majd adja meg a saját. Ez a clone() módszerrel történik. Lássuk, hogyan történik.

Java Cloneable interface and clone () method

minden olyan nyelv, amely támogatja az objektumok klónozását, rendelkezik saját szabályokkal, így a java is. Java-ban, ha egy osztálynak támogatnia kell a klónozást, akkor a következő dolgokat kell tennie:

  1. végre kell hajtania a Cloneable felületet.
  2. felül kell írnia aclone() módszert az Objektumosztályból.

tovább: Cloneable interface is broken in java

Java docs about clone() method are giving low (formázva és kivonatolva).

  1. az első utasítás garantálja, hogy a klónozott objektumnak külön memóriacím-hozzárendelése lesz.
  2. a második állítás azt sugallja, hogy az eredeti és klónozott objektumoknak azonos osztálytípussal kell rendelkezniük, de ez nem kötelező.
  3. harmadik állítás azt sugallja, hogy az eredeti és klónozott objektumoknak egyenlőnek kell lenniük egyenlő() módszerrel, de ez nem kötelező.

értsük meg a Java klónt példával. Első osztályunkEmployee osztály 3 attribútummal – idname ésdepartment.

Department az osztálynak két attribútuma van – id és name.

tehát, ha klónozni kell a munkavállalói osztályt, akkor valami ilyesmit kell tennünk.

nagyszerű, sikeresen klónoztuk a Employee objektumot. De ne feledje, hogy két hivatkozás van ugyanarra az objektumra, most mindkettő megváltoztatja az objektum állapotát az alkalmazás különböző részein. Szeretné látni, hogyan? Lássuk csak.

Hoppá, klónozott objektum változások láthatók az eredeti is. Így a klónozott objektumok pusztítást okozhatnak a rendszerben, ha ezt megengedik. Bárki jöhet és klónozhatja az alkalmazás objektumait, és azt csinálhat, amit akar. Meg tudjuk ezt akadályozni??

válasz igen, tudjuk. Ezt megakadályozhatjuk a Java deep copy létrehozásával és a copy constructors használatával. Később megtudjuk őket ebben a bejegyzésben. Először nézzük meg, mi a mély klónozás és a sekély klónozás Java-ban.

Java Shallow Copy

Shallow clone is “default implementation” in Java. Felülírvaclone módszer, ha nem klónozza az összes objektumtípust (nem primitíveket), akkor sekély másolatot készít.

a fenti példák csak a sekély példányokra vonatkoznak, mert nem klónoztuk a Department objektumot a Employee osztály clone módszer. Most, továbblépek a következő szakaszra, ahol látni fogjuk a mély klónozást.

Java Deep Copy

Deep clone a kívánt viselkedés a legtöbb esetben. A mély másolatban létrehozunk egy klónt, amely független az eredeti objektumtól, a klónozott objektum módosítása pedig nem befolyásolhatja az eredeti objektumot.

lássuk, hogy a deep copy hogyan jön létre Java-ban.

I modified theEmployee classesclone() method and added followingclone method inDepartment class.

most a klónozási kód tesztelése adja meg a kívánt eredményt, az osztály neve pedig nem módosul.

itt a klónozott objektum állapotának megváltoztatása nem befolyásolja az eredeti objektumot.

tehát a mély klónozás a következő szabályok kielégítését igényli –

  • nincs szükség külön primitívek másolására.
  • az eredeti osztály összes tagosztályának támogatnia kell az eredeti osztály klónozását és az eredeti osztály klón módszerét a kontextusban a super.clone() – nak kell hívnia minden tagosztályon.
  • ha egy tagosztály nem támogatja a klónozást, akkor a klón metódusban létre kell hozni az adott tagosztály új példányát, és minden attribútumát egyenként át kell másolni az új tagosztály objektumra. Ez az új tagosztály objektum klónozott objektumban lesz beállítva.

bővebben: Mély klónozás segítségével memória sorozatkészítés

Java Másolás Konstruktőri

Másolás konstruktőri különleges konstruktőri egy osztály, amely veszi az érvet saját osztály típusát. Tehát, ha át egy példánya osztály másolni Kivitelező, majd Kivitelező visszatér egy új példánya osztály értékeket másolt érv példány. Segít klónozni az objektumot klónozható felülettel.

láthatjuk ezt a példában:

public class PointOne {private Integer x;private Integer y;public PointOne(PointOne point){this.x = point.x;this.y = point.y;}}

Ez a módszer egyszerűnek tűnik, amíg jön öröklés. Ha meg egy osztály kiterjesztésével fenti osztály, meg kell határozni egy hasonló Kivitelező ott is. A gyermekosztályban a gyermekspecifikus attribútumokat kell lemásolni, majd az argumentumot át kell adni a super class konstruktorának. Lássuk, hogyan?

tehát most jól vagyunk? Nem. Az öröklés problémája az, hogy a pontos viselkedést csak futási időben azonosítják. Tehát a mi esetünkben, ha néhány osztály átment a PointTwo példányán a PointOnekivitelezőben.

ebben az esetben a PointOne példányát kapja, ahol argumentumként átadta a PointTwo példányt. Lássuk ezt a kódot:

a másolás-konstruktor létrehozásának másik módja a statikus gyári módszerek. Az osztály típusát argumentumban veszik fel, majd egy új példányt hoznak létre az osztály másik konstruktorával. Ezután ezek a gyári módszerek átmásolják az összes állami adatot az előző lépésben létrehozott új osztálypéldányba, majd visszaadják ezt a frissített példányt.

Java deep copy with serialization

Serialization is another easy way of deep cloning. Ebben a módszerben csak sorosítja a klónozandó objektumot, majd sorosítja azt. Nyilvánvaló, hogy a klónozandó objektumnak végre kell hajtania a Serializable interfészt.

mielőtt továbbmennék, vigyáznom kell arra, hogy ezt a technikát nem szabad enyhén használni.

  1. először is, a szerializáció rendkívül drága. Könnyen lehet százszor drágább, mint a clone() módszer.
  2. második, nem minden objektum Serializable.
  3. harmadik, így egy osztály Serializable trükkös, és nem minden osztály lehet hivatkozni, hogy ez jobb.

tovább: útmutató a serialization végrehajtásához Java

Java klón – SerializationUtils

az Apache commons-ban, SerializationUtils class is rendelkezik segédprogram funkcióval mély klónozás. Ha úgy érzi, érdekli a kövesse a hivatalos dokumentumok.

<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.7</version></dependency>
SomeObject cloned = org.apache.commons.lang.SerializationUtils.clone(someObject);

Java Clone best practices

  1. ha nem tudja, hogy hívhatja-e a clone() egy adott osztály módszerét, mivel nem biztos abban, hogy az adott osztályban végrehajtják-e, ellenőrizheti, hogy egy adott osztály módszerét az osztály az alábbi “Cloneable” interfész példánya.
    if(obj1 instanceof Cloneable){ obj2 = obj1.clone();}//Dont do this. Cloneable dont have any methodsobj2 = (Cloneable)obj1.clone();
  2. a klónozott objektumon nincs konstruktor. Ennek eredményeként az Ön felelőssége, hogy megbizonyosodjon arról, hogy minden tag megfelelően van-e beállítva. Továbbá, ha nyomon követi a rendszerben lévő objektumok számát A konstruktorok meghívásának számlálásával, akkor új kiegészítő helyet kapott a számláló növeléséhez.

remélem, hogy ez a bejegyzés már egy frissítő az Ön számára, és segít minél több információt Java 8 clone módszer, és ez helyes használat. Segít a Java klón interjú kérdéseinek megválaszolásában is.

Boldog tanulás !!

hasznos volt ez a bejegyzés?

tudassa velünk, hogy tetszett-e a bejegyzés. Csak így tudunk fejlődni.
Igen
nem

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük