logo

Clone () metodas Java

Objekto klonavimas reiškia tikslios objekto kopijos sukūrimą. Jis sukuria naują esamo objekto klasės egzempliorių ir visus jo laukus inicijuoja tiksliai su atitinkamų šio objekto laukų turiniu.

„Java“ objektų klonavimo metodai

Yra 3 būdai, kaip sukurti objektų klonavimą Java programoje, kurie paminėti toliau:

  1. Priskyrimo operatoriaus naudojimas nuorodos kintamojo kopijai sukurti
  2. Kopijos kūrimas naudojant clone() metodą
  3. Klono() metodo naudojimas – Deep Copy

1. Naudodami priskyrimo operatorių sukurti a kopiją atskaitos kintamasis

Java programoje nėra operatoriaus, kuris sukurtų objekto kopiją. Skirtingai nuo C++, Java, jei naudosime priskyrimo operatorių, jis sukurs nuorodos kintamojo, o ne objekto, kopiją. Tai galima paaiškinti pavyzdžiu. Toliau pateikta programa parodo tą patį.



Žemiau pateikiamas aukščiau pateiktos temos įgyvendinimas:

Java




jpa vs hibernate

// 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);> >}> }>

>

>

Išvestis

10 20 100 20 100 20>

2. Kopijos kūrimas naudojant clone() metodą

Klasėje, kurios objekto kopija turi būti padaryta, joje arba vienoje iš pirminių klasių turi būti viešasis klonavimo metodas.

fmovies
  • Kiekviena klasė, kuri įgyvendina clone(), turėtų iškviesti super.clone(), kad gautų klonuoto objekto nuorodą.
  • Klasė taip pat turi įdiegti java.lang.Cloneable sąsają, kurios objekto kloną norime sukurti, kitaip ji išmes CloneNotSupportedException, kai klonavimo metodas bus iškviestas tos klasės objektu.

Sintaksė:

protected Object clone() throws CloneNotSupportedException>

i) Klono() metodo naudojimas – sekli kopija

Pastaba – Toliau pateiktame kodo pavyzdyje metodas clone() sukuria visiškai naują objektą su kita maišos kodo reikšme, o tai reiškia, kad jis yra atskiroje atminties vietoje. Tačiau dėl to, kad bandomasis objektas c yra Test2 viduje, primityvūs tipai pasiekė gilią kopiją, tačiau šis bandomasis objektas c vis dar yra bendras tarp t1 ir t2. Norėdami tai išspręsti, mes aiškiai nukopijuojame objekto kintamąjį c, kuris bus aptartas vėliau.

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);> >}> }>

>

>

Išvestis

10 20 300 40 100 20 300 40>

Aukščiau pateiktame pavyzdyje t1.clone grąžina negilią objekto t1 kopiją. Norint gauti gilią objekto kopiją, gavus kopiją reikia atlikti tam tikrus klonavimo metodo pakeitimus.

ii) Klono() metodo naudojimas – gilioji kopija

  • Jei norime sukurti gilią objekto X kopiją ir įdėti ją į naują objektą Y, sukuriama nauja visų nurodytų objektų laukų kopija ir šios nuorodos įdedamos į objektą Y. Tai reiškia bet kokius pakeitimus, padarytus nurodyto objekto laukuose objekte. X arba Y atsispindės tik tame objekte, o kitame ne. Žemiau pateiktame pavyzdyje sukuriame gilią objekto kopiją.
  • Gilioji kopija nukopijuoja visus laukus ir daro dinamiškai paskirstytos atminties, į kurią nukreipia laukai, kopijas. Gilus kopijavimas atsiranda, kai objektas yra nukopijuotas kartu su objektais, į kuriuos jis nurodo.

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);> >}> }>

simbolis į eilutę java

>

>

Išvestis

10 20 30 40 100 20 300 40>

Aukščiau pateiktame pavyzdyje matome, kad naujas testas klasės objektas buvo priskirtas nukopijuoti objektą, kuris bus grąžintas į klonavimo metodą. Dėl to t3 gaus gilią objekto t1 kopiją. Taigi bet kokie „c“ objekto laukuose atlikti t3 pakeitimai nebus atspindėti t1.

Gili kopija vs sekli kopija

Yra tam tikrų skirtumų tarp klono () naudojimo kaip gilios kopijos ir kaip seklios kopijos, kaip nurodyta toliau:

  • Sekli kopija yra objekto kopijavimo būdas ir pagal numatytuosius nustatymus naudojamas klonuojant. Taikant šį metodą, seno objekto X laukai nukopijuojami į naują objektą Y. Kopijuojant objekto tipo lauką nuoroda nukopijuojama į Y, t. y. objektas Y nukreips į tą pačią vietą, kurią nurodė X. Jei lauko reikšmė yra primityvus tipas, jis kopijuoja primityvaus tipo reikšmę.
  • Todėl bet kokie X arba Y objekto nuorodų objektų pakeitimai atsispindės kituose objektuose.

Seklios kopijos yra pigios ir lengvai pagaminamos. Aukščiau pateiktame pavyzdyje sukūrėme negilią kopiją į objektas.

Kodėl verta naudoti klono metodą() arba Klonavimo metodo privalumai

  • Jei naudosime priskyrimo operatorių objekto nuorodai priskirti kitam nuorodos kintamajam, jis nurodys tą pačią senojo objekto adreso vietą ir nebus sukurta nauja objekto kopija. Dėl šios priežasties bet kokie atskaitos kintamojo pakeitimai atsispindės pradiniame objekte.
  • Jei naudojame kopijavimo konstruktorių, turime aiškiai nukopijuoti visus duomenis, t. y. turime aiškiai iš naujo priskirti visus konstruktoriaus klasės laukus. Tačiau taikant klonavimo metodą, šis naujos kopijos kūrimo darbas atliekamas pačiu metodu. Taigi, norėdami išvengti papildomo apdorojimo, naudojame objektų klonavimą.