Duboko Kopiranje ili Plitka Kopiraj u Javi - Kako odabrati?

Deep_shallow_copy

Duboko kopija i plitko kopija

Pregled: U ovom članku ćemo raspraviti proces preslikavanja objekata u Javi. Svrha kopiranja može se razlikuju na temelju zahtjeva za prijavu. No, tu su uglavnom dvije vrste kopiranja na raspolaganju, duboka i plitka kopija. Način kopiranja se razlikuje u ta dva pristupa.

Uvođenje:
Djelovanje kopiranje atribute jednog objekta u drugi od iste vrste podataka se zove predmet kopija. U java, imamo sljedeće pristupe kopiranje jednog objekta u drugi

  • plitka Copy: Evo, ako je polje koje treba kopirati je primitivni oblik, onda je vrijednost kopira inače ako je polje koje treba kopirati je memorijska adresa (ili samog objekta) zatim adresa kopira. Dakle, ako je adresa se mijenja jedan objekt, promjena dobiva ogleda svugdje.
  • duboko Copy: Ovdje se podaci kopiraju u oba situacijama. Ovaj pristup je skuplji i sporiji.
  • Lazy Copy: To je kombinacija gornjih dvaju pristupa. U početku je plitka kopija pristup se koristi, a zatim provjeriti da li se podaci dijele mnogi predmeti i program treba izmijeniti objekt, duboko pristup primjerak se koristi.

Tako možemo odabrati vrstu kopiranja na temelju sljedeća dva uvjeta

  • Koristite plitko kopiranje, kada nema potrebe za ovijanje.
  • Koristite duboku kopiranje kada je potrebno ovijanje.

plitka Copy:

U plitkoj primjerak, novi predmet je stvorio, koji sadrži točnu kopiju vrijednosti u izvornom predmetu. Plitka kopija slijedi pristup kopiranja bit-mudar. U plitkoj primjerak, ako je polje memorijska adresa, zatim adresa kopira. Dakle, ako je adresa se mijenja jedan objekt, promjena dobiva ogleda svugdje.

Shallow copy

plitka kopija

Figure 1: Dijagram toka opisuje plitko kopiju

Na ovoj slici, objekt – mainObj1 ima polje zove kao polju1 nekog primitivnog tipa reći int, i objekt tipa String Kada radimo plitku kopiju mainObj1, mainObj2 je stvoren s polju2 tipa int koja sadrži kopirane vrijednost polju1 nego String objekt u mainObj2 – i dalje ukazuje da se objStr. Od polje 1 je primitivni tip podataka, vrijednost toga se kopira u polju 2. No, budući da objStr je objekt, mainObj2 ukazuje na istoj adresi objStr. Dakle, sve promjene koje su napravljene na objStr preko mainObj1 se odražava u mainObj2.

Implementacija:

[kod]

Listing 1: Klasa SubjectVO.java opisuje vrijednost objekta za predmete

package com.home.objectCopy;

javni razred SubjectVO {

privatan String name;

/**

* @povratak Ime

*/

javni string getName() {

return ime;

}

/**

* param ime

* naziv za postavljanje

*/

javni poništiti setName(String name) {

ovo.name = Naziv;

}

javni SubjectVO(String name) {

ovo.name = Naziv;

}

}

[/kod]

Listing 2: Klasa PupilVO.java opisuje vrijednost objekta za učenika

[kod]

package com.home.objectCopy;

javni razred PupilVO provodi Cloneable {

// sadržane objekt

privatan SubjectVO Pr;

privatan String name;

/**

* @povratak the Pr

*/

javni SubjectVO getSubj() {

return Pr;

}

/**

* param Pr

* the Pr postaviti

*/

javni poništiti setSubj(SubjectVO Pr) {

ovo.Pr = Pr;

}

/**

* @povratak Ime

*/

javni string getName() {

return ime;

}

/**

* param ime

* naziv za postavljanje

*/

javni poništiti setName(String name) {

ovo.name = Naziv;

}

javni PupilVO(String name, sub string) {

ovo.name = Naziv;

ovo.Pr = novi SubjectVO(pod);

}

javni klon objekta() {

// plitka kopija

pokušati {

return super.klon();

} ulov (CloneNotSupportedException e) {

return nula;

}

}

}

[/kod]

Listing3: Klasa ShallowCopyTest.java opisuje proces kopiranja

[kod]
package com.home.objectCopy;

javni razred ShallowCopyTest {

javni statički poništiti glavni(Gudački[] args) {

// Izvorni objekt

PupilVO stud = novi PupilVO(“Johnathan”, “Algebra”);

Sistem.van.println(“Izvorni objekt: ” + stud.getName() + ” – ”

+ stud.getSubj().getName());

// Klon objekta

PupilVO clonedStud = (PupilVO) stud.clone();

Sistem.van.println(“klonirana objekta: ” + clonedStud.getName() + ” – ”

+ clonedStud.getSubj().getName());

stud.setName(“Danijel”);

stud.getSubj().setName(“Fizika”);

Sistem.van.println(“Izvorni objekt nakon što je obnovljeno: ”

+ stud.getName() + ” – ” + stud.getSubj().getName());

Sistem.van.println(“Klonirana objekta nakon ažuriranja izvorni objekt: ”

+ clonedStud.getName() + ” – ”

+ clonedStud.getSubj().getName());

}

}

[/kod]

Izlaz: Izlaz ovog programa je kao pod

Izvorni objekt: Johnathan – Algebra

klonirana objekta: Johnathan – Algebra

Izvorni objekt nakon što je obnovljeno: Danijel – Fizika

Klonirana objekta nakon ažuriranja izvorni objekt: Johnathan – Fizika

Ovdje vidimo da je vrijednost naziv polja dobiva se promijenilo nakon operacije kopiranja ali vrijednost objekta predmeta ostaje isti kao što je to ukazuje na istu memorijsku adresu. Stoga je predmet za Jonathana postaje 'Fizika’ gdje je kao što bi trebao biti 'Algebra’ kao objekt za SubjectVO u kloniranog objekt ostaje nepromijenjena.

duboko Copy:

U dubokoj primjerak, ne samo sva polja nekog objekta kopiraju, svi dinamički dodijeljene memorije adresa koja se istaknula ta objekta također se kopira.

Deep Cpoy

duboko Copy

Figure 2: Dijagram opisuje duboku proces kopiranja

Na ovoj slici, objekt mainObj1 ima polja polju1 primitivni tip podataka reći int, i objekt tipa String Kada činimo duboki kopiju mainObj1, mainObj2 je stvoren sa polju2 sadrži kopirane vrijednost polju1 i objStr2 je stvoren koja sadrži kopirane vrijednost objStr1 Dakle sve promjene koje su napravljene na objStr1 u mainObj1 neće odraziti na mainObj2.

Implementacija:

Listing4: Klasa opisuje duboku kopiju

[Code]

package com.home.DeepCopy;

javni razred PupilVO provodi Cloneable {

// sadržane objekt

privatan SubjectVO Pr;

privatan String name;

/**

* @povratak the Pr

*/

javni SubjectVO getSubj() {

return Pr;

}

/**

* param Pr

* the Pr postaviti

*/

javni poništiti setSubj(SubjectVO Pr) {

ovo.Pr = Pr;

}

/**

* @povratak Ime

*/

javni string getName() {

return ime;

}

/**

* param ime

* naziv za postavljanje

*/

javni poništiti setName(String name) {

ovo.name = Naziv;

}

javni PupilVO(String name, sub string) {

ovo.name = Naziv;

ovo.Pr = novi SubjectVO(pod);

}

javni klon objekta() {

// duboko kopija

PupilVO učenik = novi PupilVO(ime, subj.getName());

return učenik;

}

}

[/kod]

Jedina razlika između ovog pristupa i ranijeg pristupa je da se metoda klon u PupilVO vraća novostvoreni PupilVO objekt. To osigurava da, kad god je pokrenuo kopija mehanizam u, objekt SubjectVO također dobiva promijenjen. Duboko kopija ima alternativni pristup – serialization. u serialization, cijeli objekt graf je pisano u upornom dućan i pročitati natrag kada je potrebno. Dakle, kad god čitamo objekt od upornog trgovine, izvorni objekt naziva.

Korištenje plitko kopiranje i duboko kopiju:

Nema tvrdih i brzo pravila definirana za odabir između plitkog kopiranje i duboko primjerak, ali u pravilu treba imati na umu da, ako neki predmet ima samo primitivne polja, onda očito trebamo ići za plitku kopiju, ali ako objekt ima reference na druge objekte, zatim na temelju zahtjeva, plitko kopija ili duboko primjerak treba biti učinjeno. Ako reference ne ažuriraju onda nema smisla da pokrene duboko kopiju.

Objasnite lijeni kopiju:

Lijen kopija može se definirati kao kombinacija oba plitke kopije i duboko kopiju. Mehanizam slijedi jednostavan pristup – u početno stanje, plitko kopija pristup koristi. Protutužba se također koristi za voditi evidenciju o tome kako mnogi objekti dijele podatke. Kada program želi modificirati izvorni objekt, provjerava je li objekt se dijeli ili ne. Ako je objekt se dijeli, onda je duboko kopija mehanizam je pokrenut.

Summary:

U plitkoj primjerak, samo polja primitivne vrste podataka kopiraju, dok su objekti reference ne kopiraju. Duboko kopija uključuje primjerak primitivnog tipa podataka kao objet reference. Nema tvrdih i brzo pravila o tome kada će se obaviti plitku kopiju i kada to učiniti duboko kopiju. Lazy kopija je kombinacija oba ova pristupa.

Tagged on:
============================================= ============================================== Buy best TechAlpine Books on Amazon
============================================== ---------------------------------------------------------------- electrician ct chestnutelectric
error

Enjoy this blog? Please spread the word :)

Follow by Email
LinkedIn
LinkedIn
Share