Objektin kloonaus tarkoittaa tarkan kopion luomista objektista. Se luo uuden ilmentymän nykyisen objektin luokasta ja alustaa kaikki sen kentät täsmälleen tämän objektin vastaavien kenttien sisällöllä.
silmukalle java
Menetelmät objektin kloonaukseen Javassa
Alla on mainittu kolme tapaa luoda objektikloonaus Javassa:
- Assignment Operatorin avulla luodaan kopio viitemuuttujasta
- Kopion luominen klone()-menetelmällä
- Klooni()-menetelmän käyttö – Deep Copy
1. Luo Assignment Operator a kopio viitemuuttuja
Javassa ei ole operaattoria, joka luo objektin kopion. Toisin kuin C++, Javassa, jos käytämme määritysoperaattoria, se luo kopion viitemuuttujasta eikä objektista. Tämä voidaan selittää esimerkin avulla. Seuraava ohjelma osoittaa saman.
Alla on yllä olevan aiheen toteutus:
Java
// 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);> >}> }> |
>
fmovies
>Lähtö
10 20 100 20 100 20>
2. Kopion luominen klone()-menetelmällä
Luokassa, jonka objektin kopio tehdään, on oltava julkinen kloonimenetelmä siinä tai yhdessä sen yläluokista.
- Jokaisen luokan, joka toteuttaa clone():n, tulee kutsua super.clone() saadakseen kloonatun objektin viittauksen.
- Luokan tulee myös toteuttaa java.lang.Cloneable-liitäntä, jonka objektikloonin haluamme luoda, muuten se heittää CloneNotSupportedExceptionin, kun kloonimenetelmää kutsutaan kyseisen luokan objektiin.
Syntaksi:
protected Object clone() throws CloneNotSupportedException>
i) Klooni()-menetelmän käyttö -Shallow Copy
Huomautus – Alla olevassa koodiesimerkissä clone()-menetelmä luo täysin uuden objektin, jolla on eri hashCode-arvo, mikä tarkoittaa, että se on erillisessä muistipaikassa. Mutta koska testiobjekti c on Test2:n sisällä, primitiivityypit ovat saavuttaneet syvän kopion, mutta tämä testiobjekti c on edelleen jaettu t1:n ja t2:n välillä. Tämän ratkaisemiseksi teemme eksplisiittisesti syväkopion objektimuuttujalle c, jota käsitellään myöhemmin.
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);> >}> }> |
>
>Lähtö
10 20 300 40 100 20 300 40>
Yllä olevassa esimerkissä t1.clone palauttaa objektin t1 matalan kopion. Kohteen syväkopion saamiseksi kloonimenetelmään on tehtävä tietyt muutokset kopion hankkimisen jälkeen.
ii) Klooni()-menetelmän käyttö – Deep Copy
- Jos haluamme luoda syväkopion objektista X ja sijoittaa sen uuteen objektiin Y, luodaan uusi kopio kaikista viitatuista objektikentistä ja nämä viittaukset sijoitetaan objektiin Y. Tämä tarkoittaa kaikkia muutoksia, jotka on tehty kohteen viitattuihin objektikenttiin. X tai Y heijastuu vain kyseiseen objektiin, ei toiseen. Alla olevassa esimerkissä luomme syvän kopion kohteesta.
- Syväkopio kopioi kaikki kentät ja tekee kopioita kenttien osoittamasta dynaamisesti varatusta muistista. Syväkopio syntyy, kun objekti kopioidaan niiden objektien kanssa, joihin se viittaa.
Java
java char merkkijonoon
abs c koodi
// 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);> >}> }> |
>
>Lähtö
10 20 30 40 100 20 300 40>
Yllä olevassa esimerkissä voimme nähdä, että Test-luokan uusi objekti on määritetty kopioimaan objekti, joka palautetaan kloonimenetelmään. Tästä johtuen t3 saa syvän kopion objektista t1. Joten t3:n 'c'-objektikenttiin tekemät muutokset eivät näy t1:ssä.
Deep Copy vs Shallow Copy
On tiettyjä eroja klone():n käytön välillä syväkopiona ja matalana kopiona, kuten alla mainitaan:
- Matala kopio on objektin kopiointimenetelmä, ja sitä seuraa oletuksena kloonauksessa. Tässä menetelmässä vanhan objektin X kentät kopioidaan uuteen objektiin Y. Kohdetyyppikenttää kopioitaessa viittaus kopioidaan kohtaan Y, eli objekti Y osoittaa samaan paikkaan kuin X osoittaa. Jos kentän arvo on primitiivinen tyyppi, se kopioi primitiivityypin arvon.
- Siksi kaikki objektin X tai Y viitattuihin objekteihin tehdyt muutokset näkyvät muissa objekteissa.
Matalat kopiot ovat halpoja ja helppoja tehdä. Yllä olevassa esimerkissä loimme matalan kopion kohteesta the esine.
Miksi käyttää kloonimenetelmää() tai Kloonimenetelmän edut
- Jos käytämme määritysoperaattoria kohdeviittauksen määrittämiseen toiselle viitemuuttujalle, se osoittaa vanhan objektin samaan osoitepaikkaan eikä objektista luoda uutta kopiota. Tästä johtuen kaikki muutokset viitemuuttujassa näkyvät alkuperäisessä objektissa.
- Jos käytämme kopiokonstruktoria, meidän on kopioitava kaikki tiedot eksplisiittisesti, eli meidän on määritettävä kaikki luokan kentät uudelleen konstruktorissa. Mutta kloonimenetelmässä tämä uuden kopion luontityö tehdään itse menetelmällä. Joten ylimääräisen käsittelyn välttämiseksi käytämme objektin kloonausta.