Deep Copy edo Java Shallow Copy - Nola aukeratu?

Deep_shallow_copy

Deep kopia eta azaleko kopia

Orokorra: Artikulu honetan Java objektuak kopiatzeko prozesuan hitz egingo dugu. kopiatzea helburua ezberdinetan oinarritzen daiteke aplikazio baldintza. Baina ez dira, batez ere, bi kopiatzea eskuragarri mota, sakon eta azaleko kopia. kopiatzea metodoa bi ikuspegi horiek ere aldatu egiten da.

Sarrera:
objektu bat atributuak kopiatzea datu-mota bereko beste sartu ekintza deritzo objektuaren kopia. Java, Hurrengo kopiatzea objektu baten planteamendu beste bat sartu behar dugu

  • Shallow Copy: eremuan, hau da kopiatu beharreko jatorrizko mota bat da Here bada, orduan balio du, bestela, kopiatu eremuan zein da kopiatu beharreko memoria-helbide bat baldin bada (edo objektu bat bera) ondoren, helbidea kopiatu. Horrela helbidea da aldatu bada objektu batek, aldaketa islatzen lortzen nonahi.
  • Deep Copy: Hemen datuak egoerak bai kopiatu. Planteamendu honek costlier eta motelagoa da.
  • Lazy Copy: Hau baino bi planteamendu konbinazioa da. Hasieran azaleko kopia hurbilketa erabiltzen da eta, ondoren, egiaztatu, datuak objektu askok badu eta programa behar objektu bat aldatzeko, sakona kopia hurbilketa erabiltzen da.

Beraz oinarritutako bi baldintza hauek on kopiatzea mota aukeratu ahal izango dugu

  • Erabili azaleko kopiatzea kapsulatzea ez dira baliagarriak.
  • Erabili sakona kopiatzea kapsulatzea behar denean.

Shallow Copy:

azaleko kopia ere, Objektu berri bat sortzen da balioak kopia zehatza jatorrizko objektuaren dauka. Shallow kopiarekin bit-wise kopia planteamendu jarraitzen. azaleko kopia ere bada eremuan memoria-helbide bat da, ondoren, helbidea kopiatu. Horrela helbidea da aldatu bada objektu batek, aldaketa islatzen lortzen nonahi.

Shallow copy

Shallow kopia

Figure 1: fluxua azaleko kopia deskribatzen

Kopuru horretatik, objektuaren – mainObj1 jatorrizko mota bat 1eremua gisa izeneko eremu bat du esan int, eta mota String objektu bat denean azaleko mainObj1 kopia bat egiten dugu, mainObj2 mota int field2 bertan kopiatutako 1eremua balioa baina String mainObj2 objektuaren izanez sortzen da – oraindik puntu bera objStr den. Geroztik 1eremua datu mota primitibo bat da, duen balioa da field2 kopiatzen. Baina geroztik objStr objektu bat da, mainObj2 da objStr helbide bera seinalatuz. Beraz objStr egin mainObj1 bidez edozein aldaketa emateko mainObj2 islatuko.

Implementation:

[kodea]

Listing 1: Class SubjectVO.java balio ikasgaien objektu deskribatzen

package com.home.objectCopy;

publikoak klase SubjectVO {

pribatua Kate izena;

/**

* @return izenean

*/

publikoak String getName() {

return izena;

}

/**

* @param izena

* name ezarri

*/

publikoak gal setName(Kate izena) {

hau.name = Izen;

}

publikoak SubjectVO(Kate izena) {

hau.name = Izen;

}

}

[/kodea]

Listing 2: Class PupilVO.java balio objektu deskribatzen duen ikaslea da

[kodea]

package com.home.objectCopy;

publikoak klase PupilVO lanabesen Cloneable {

// jasotako objektu

pribatua SubjectVO subj;

pribatua Kate izena;

/**

* @return the subj

*/

publikoak SubjectVO getSubj() {

return subj;

}

/**

* @param subj

* the subj jarri

*/

publikoak gal setSubj(SubjectVO subj) {

hau.subj = subj;

}

/**

* @return izenean

*/

publikoak String getName() {

return izena;

}

/**

* @param izena

* name ezarri

*/

publikoak gal setName(Kate izena) {

hau.name = Izen;

}

publikoak PupilVO(Kate izena, String sub) {

hau.name = Izen;

hau.subj = berriak SubjectVO(sub);

}

publikoak Objektu clone() {

// azaleko kopia

saiatu {

return super.clone();

} harrapatzeko (CloneNotSupportedException e) {

return zero;

}

}

}

[/kodea]

Listing3: Class ShallowCopyTest.java deskribatuz kopia prozesua

[kodea]
package com.home.objectCopy;

publikoak klase ShallowCopyTest {

publikoak estatiko gal nagusia(Katea[] argumentuak) {

// Original Object

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

Sistema.errondan.println(“Original Object: ” + stud.getName() + ” – ”

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

// Clone Object

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

Sistema.errondan.println(“Konfigurazioa Object: ” + clonedStud.getName() + ” – ”

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

stud.setName(“Daniel”);

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

Sistema.errondan.println(“Original Object ondoren eguneratzen da: ”

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

Sistema.errondan.println(“Konfigurazioa jatorrizko objektu eguneratzeko ondoren Object: ”

+ clonedStud.getName() + ” – ”

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

}

}

[/kodea]

Output: Programa honen irteera azpian bezala da

Original Object: Johnathan – Algebra

Konfigurazioa Object: Johnathan – Algebra

Original Object ondoren eguneratzen da: Daniel – Fisika

Konfigurazioa jatorrizko objektu eguneratzeko ondoren Object: Johnathan – Fisika

Hemen eremu izenaren balioa lortzen kopia eragiketa ondoren aldatu ikusi dugu baina objektu gaia balioa berdina izaten jarraitzen du, memoria bera helbidera apuntatzen den bezala. Hori dela eta Jonathan egiteko gaia 'Fisika bihurtzen’ non gisa Algebra izan behar da '’ SubjectVO dagoen objektuaren klonatu objektu ere aldatu gabe geratzen den bezala.

Deep Copy:

kopia sakona, Objektu baten eremu guztiak ez bakarrik kopiatuko dira, dinamikoki esleitutako memoria helbide guztiak bertan dago, objektu horren arabera adierazi halaber kopiatu.

Deep Cpoy

Deep Copy

Figure 2: diagram sakona kopia prozesua deskribatzen

Kopuru horretatik, Objektu mainObj1 zelai 1eremua datu mota primitibo bat esan int, eta mota String objektu bat denean mainObj1 kopia sakon bat egin dugu, mainObj2 field2 kopiatuko 1eremua balioa duten eta objStr2 sortzen da kopiatutako objStr1 balioa Beraz objStr1 egin mainObj1 edozein aldaketa ez da izango mainObj2 islatzea sortzen da.

Implementation:

Listing4: Class sakona kopia deskribatuz

[Code]

package com.home.DeepCopy;

publikoak klase PupilVO lanabesen Cloneable {

// jasotako objektu

pribatua SubjectVO subj;

pribatua Kate izena;

/**

* @return the subj

*/

publikoak SubjectVO getSubj() {

return subj;

}

/**

* @param subj

* the subj jarri

*/

publikoak gal setSubj(SubjectVO subj) {

hau.subj = subj;

}

/**

* @return izenean

*/

publikoak String getName() {

return izena;

}

/**

* @param izena

* name ezarri

*/

publikoak gal setName(Kate izena) {

hau.name = Izen;

}

publikoak PupilVO(Kate izena, String sub) {

hau.name = Izen;

hau.subj = berriak SubjectVO(sub);

}

publikoak Objektu clone() {

// sakona kopia

PupilVO Pupil = berriak PupilVO(izena, subj.getName());

return Pupil;

}

}

[/kodea]

Planteamendu hau eta lehenbiziko hurbilketa arteko diferentzia bakarra da clone PupilVO metodoa sortu berriak PupilVO objektu bat itzultzen du. Honek bermatzen du, betiere kopia mekanismoa abian, Objektu SubjectVO ere aldatu lortzen. Deep kopia planteamendu alternatiboa dute – serializaziorako. serializaziorako In, oro har objektu grafikoaren iraunkorrak denda batean idatzita dago eta irakurtzeko beharrezkoa denean. Beraz, betiere objektu irakurri dugu hau iraunkor dendatik, jatorrizko objektuak aipatzen da.

azaleko kopia eta kopia sakona erabilera:

Ez dago arau zorrotz azaleko kopia eta kopia sakona baina normalean Gogoan izan behar dugu arteko hautatzeko definitzen da objektu bat bakarrik primitibo eremuak badu, orduan, jakina dugu azaleko kopia joan behar, baina objektua beste objektu batzuen erreferentziak badu, orduan baldintza oinarritutako, azaleko kopia edo kopia sakona egin behar da. erreferentziak ez dira eguneratu bada, ondoren, ez dago puntu kopia sakon bat hasi nahi da.

Azaldu alferrak kopia:

alferrak kopia bat bai azaleko kopia eta kopia sakona konbinazio bat bezala definitu daiteke. Mekanismo hurbilketa sinple bat jarraitzen – hasierako egoera batean, azaleko kopia hurbilketa erabiltzen da. counter bat ere objektu ugari datuak nola partekatzen pista bat mantentzeko erabiltzen da. Programaren nahi duenean jatorrizko objektuak aldatzeko, Objektu konpartitua da ala ez egiaztatzen du. objektuaren partekatu bada, ondoren, sakoneko kopia mekanismoa abian da.

Summary:

azaleko kopia ere, primitibo datuak motako eremuak bakarrik kopiatuko dira objektuak erreferentziak ez dira berriz kopiatuko. Deep kopia primitibo datu mota kopia, baita objet erreferentziak dakar. Ez dago arau zorrotz denean azaleko kopia egin eta gisa copy sakon bat egin da. Lazy kopia ikuspegi horien bien konbinazio bat da.

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