logo

Metóda Clone() v jazyku Java

Klonovanie objektu znamená vytvorenie presnej kópie objektu. Vytvorí novú inštanciu triedy aktuálneho objektu a inicializuje všetky jeho polia presne s obsahom zodpovedajúcich polí tohto objektu.

Metódy vykonávania klonovania objektov v jazyku Java

Existujú 3 spôsoby vytvárania klonovania objektov v jazyku Java, ktoré sú uvedené nižšie:

  1. Pomocou operátora priradenia vytvorte kópiu referenčnej premennej
  2. Vytvorenie kópie pomocou metódy clone().
  3. Použitie metódy clone() – Deep Copy

1. Pomocou operátora priradenia vytvorte a kópiu referenčná premenná

V jazyku Java neexistuje žiadny operátor na vytvorenie kópie objektu. Na rozdiel od C++ v Jave, ak použijeme operátor priradenia, potom vytvorí kópiu referenčnej premennej a nie objektu. Dá sa to vysvetliť na príklade. Nasledujúci program ukazuje to isté.



Nižšie je uvedená implementácia vyššie uvedenej témy:

Java


obrátenie reťazca v jave



// Java program to demonstrate that assignment operator> // only creates a new reference to same object> import> java.io.*;> > // A test class whose objects are cloned> class> Test {> >int> x, y;> >Test()> >{> >x =>10>;> >y =>20>;> >}> }> > // Driver Class> class> Main {> >public> static> void> main(String[] args)> >{> >Test ob1 =>new> Test();> > >System.out.println(ob1.x +>' '> + ob1.y);> > >// Creating a new reference variable ob2> >// pointing to same address as ob1> >Test ob2 = ob1;> > >// Any change made in ob2 will> >// be reflected in ob1> >ob2.x =>100>;> > >System.out.println(ob1.x +>' '> + ob1.y);> >System.out.println(ob2.x +>' '> + ob2.y);> >}> }>

filmy

>

>

Výkon

10 20 100 20 100 20>

2. Vytvorenie kópie pomocou metódy clone().

Trieda, ktorej kópia objektu sa má vytvoriť, musí mať v sebe alebo v jednej zo svojich rodičovských tried verejnú metódu klonovania.

  • Každá trieda, ktorá implementuje clone(), by mala zavolať super.clone(), aby získala referenciu na klonovaný objekt.
  • Trieda musí tiež implementovať rozhranie java.lang.Cloneable, ktorého klon objektu chceme vytvoriť, inak vyvolá výnimku CloneNotSupportedException, keď sa na objekt danej triedy zavolá metóda klonovania.

Syntax:

protected Object clone() throws CloneNotSupportedException>

i) Použitie metódy clone() -Shallow Copy

Poznámka – V nižšie uvedenom príklade kódu metóda clone() vytvorí úplne nový objekt s inou hodnotou hashCode, čo znamená, že je v samostatnom pamäťovom mieste. Ale vzhľadom na to, že objekt Test c je vo vnútri Test2, primitívne typy dosiahli hlboké kopírovanie, ale tento objekt Test c je stále zdieľaný medzi t1 a t2. Aby sme to prekonali, explicitne urobíme hĺbkovú kópiu pre objektovú premennú c, o ktorej budeme hovoriť neskôr.

funkcie arduina

Java




// A Java program to demonstrate> // shallow copy using clone()> import> java.util.ArrayList;> > // An object reference of this class is> // contained by Test2> class> Test {> >int> x, y;> }> > // Contains a reference of Test and> // implements clone with shallow copy.> class> Test2>implements> Cloneable {> >int> a;> >int> b;> >Test c =>new> Test();> >public> Object clone()>throws> CloneNotSupportedException> >{> >return> super>.clone();> >}> }> > // Driver class> public> class> Main {> >public> static> void> main(String args[])> >throws> CloneNotSupportedException> >{> >Test2 t1 =>new> Test2();> >t1.a =>10>;> >t1.b =>20>;> >t1.c.x =>30>;> >t1.c.y =>40>;> > >Test2 t2 = (Test2)t1.clone();> > >// Creating a copy of object t1> >// and passing it to t2> >t2.a =>100>;> > >// Change in primitive type of t2 will> >// not be reflected in t1 field> >t2.c.x =>300>;> > >// Change in object type field will be> >// reflected in both t2 and t1(shallow copy)> >System.out.println(t1.a +>' '> + t1.b +>' '> + t1.c.x> >+>' '> + t1.c.y);> >System.out.println(t2.a +>' '> + t2.b +>' '> + t2.c.x> >+>' '> + t2.c.y);> >}> }>

konverzia int na reťazec
>

>

Výkon

10 20 300 40 100 20 300 40>

Vo vyššie uvedenom príklade t1.clone vráti plytkú kópiu objektu t1. Na získanie hlbokej kópie objektu je potrebné po získaní kópie vykonať určité úpravy v metóde klonovania.

ii) Použitie metódy clone() – Deep Copy

  • Ak chceme vytvoriť hlbokú kópiu objektu X a umiestniť ju do nového objektu Y, vytvorí sa nová kópia všetkých polí odkazovaných objektov a tieto referencie sa umiestnia do objektu Y. To znamená, že všetky zmeny vykonané v poliach odkazovaných objektov v objekte X alebo Y sa prejavia iba v tomto objekte a nie v druhom. V nižšie uvedenom príklade vytvoríme hlbokú kópiu objektu.
  • Hlboká kópia skopíruje všetky polia a vytvorí kópie dynamicky pridelenej pamäte, na ktorú polia ukazujú. Hlboká kópia nastane, keď sa objekt skopíruje spolu s objektmi, na ktoré odkazuje.

Java




// A Java program to demonstrate> // deep copy using clone()> > // An object reference of this> // class is contained by Test2> class> Test {> >int> x, y;> }> > // Contains a reference of Test and> // implements clone with deep copy.> class> Test2>implements> Cloneable {> >int> a, b;> > >Test c =>new> Test();> > >public> Object clone()>throws> CloneNotSupportedException> >{> >// Assign the shallow copy to> >// new reference variable t> >Test2 t = (Test2)>super>.clone();> > >// Creating a deep copy for c> >t.c =>new> Test();> >t.c.x = c.x;> >t.c.y = c.y;> > >// Create a new object for the field c> >// and assign it to shallow copy obtained,> >// to make it a deep copy> >return> t;> >}> }> > public> class> Main {> >public> static> void> main(String args[])> >throws> CloneNotSupportedException> >{> >Test2 t1 =>new> Test2();> >t1.a =>10>;> >t1.b =>20>;> >t1.c.x =>30>;> >t1.c.y =>40>;> > >Test2 t3 = (Test2)t1.clone();> >t3.a =>100>;> > >// Change in primitive type of t2 will> >// not be reflected in t1 field> >t3.c.x =>300>;> > >// Change in object type field of t2 will> >// not be reflected in t1(deep copy)> >System.out.println(t1.a +>' '> + t1.b +>' '> + t1.c.x> >+>' '> + t1.c.y);> >System.out.println(t3.a +>' '> + t3.b +>' '> + t3.c.x> >+>' '> + t3.c.y);> >}> }>

>

pole reťazcov v c
>

Výkon

10 20 30 40 100 20 300 40>

Vo vyššie uvedenom príklade môžeme vidieť, že nový objekt pre triedu Test bol priradený na kopírovanie objektu, ktorý sa vráti do metódy klonovania. Vďaka tomu t3 získa hlbokú kópiu objektu t1. Takže akékoľvek zmeny vykonané v poliach objektu „c“ pomocou t3 sa neprejavia v t1.

Deep Copy vs Shallow Copy

Existujú určité rozdiely medzi použitím clone () ako hlbokej kópie a použitím plytkej kópie, ako je uvedené nižšie:

  • Plytká kópia je metóda kopírovania objektu a štandardne sa používa pri klonovaní. Pri tejto metóde sa polia starého objektu X skopírujú do nového objektu Y. Pri kopírovaní poľa typu objektu sa referencia skopíruje do Y, tj objekt Y bude ukazovať na rovnaké miesto, ako ukazuje X. Ak hodnota poľa je primitívny typ kopíruje hodnotu primitívneho typu.
  • Preto sa všetky zmeny vykonané v odkazovaných objektoch v objekte X alebo Y prejavia v iných objektoch.

Plytké kópie sú lacné a ľahko sa vyrábajú. Vo vyššie uvedenom príklade sme vytvorili plytkú kópiu a objekt.

Prečo použiť metódu clone() resp Výhody klonovacej metódy

  • Ak použijeme operátor priradenia na priradenie odkazu na objekt k inej referenčnej premennej, potom bude ukazovať na rovnaké miesto adresy starého objektu a nevytvorí sa žiadna nová kópia objektu. Vďaka tomu sa akékoľvek zmeny v referenčnej premennej prejavia v pôvodnom objekte.
  • Ak použijeme konštruktor kopírovania, potom musíme skopírovať všetky údaje explicitne, t. j. musíme explicitne priradiť všetky polia triedy v konštruktore. Ale pri klonovacej metóde túto prácu pri vytváraní novej kópie vykonáva samotná metóda. Aby sme sa vyhli ďalšiemu spracovaniu, používame klonovanie objektov.