profunda Kopio aŭ Malprofunda Kopio en Java – Kiel elekti?

Deep_shallow_copy

profunda kopio kaj malprofunda kopio

Superrigardo: En ĉi tiu artikolo ni diskutos la procezon kopii objektojn en java. La celo de kopiado povas esti malsama bazita sur la aplika postulo. Sed estas plejparte du tipoj kopii haveblan, Profunde kaj malprofunda kopio. La metodo de kopiado varias en ĉi tiuj du alproksimiĝoj.

Enkonduko:
La ago kopii la ecojn de unu objekto en alia de sama datuma tipo estas vokita objektan kopion. En java, Ni havas la sekvantajn alproksimiĝojn kopii unu objekton en alia

  • Malprofunda Kopio: Ĉi tie se la kampo kiu estas esti kopiita estas primitiva tipo, Tiam la valoro estas kopiita alia se la kampo kiu estas esti kopiita estas memora adreso (Aŭ objekto ĝi mem) Tiam la adreso estas kopiita. Tiel se la adreso estas ŝanĝita de unu objekto, La ŝanĝo akiras reflektita ĉie.
  • Profunda Kopio: Ĉi tie la datumo estas kopiita en ambaŭ la situacioj. Ĉi tiu alproksimiĝo estas pli multekosta kaj pli malrapida.
  • Maldiligenta Kopio: Tio ĉi estas kombinaĵo de la supra du alproksimiĝoj. Komence la malprofunda kopia alproksimiĝo estas uzita kaj tiam kontrolita se la datumo estas dividita de multaj objektoj kaj la programaj bezonoj modifi objekton, La profunda kopia alproksimiĝo estas uzita.

Do ni povas elekti la tipon kopii bazita sur la sekvanta du kondiĉoj

  • Uzi malprofundan kopiadon kiam neniu enkapsuligo estas postulita.
  • Uzi profundan kopiadon kiam enkapsuligo estas postulita.

Malprofunda Kopio:

En malprofunda kopio, Nova objekto estas kreita kiun enhavas la ĝustan kopion de la valoroj en la originala objekto. Malprofunda kopio sekvas la pecon-saĝa kopia alproksimiĝo. En malprofunda kopio se la kampo estas memora adreso, Tiam la adreso estas kopiita. Tiel se la adreso estas ŝanĝita de unu objekto, La ŝanĝo akiras reflektita ĉie.

Shallow copy

Malprofunda kopio

Cifero 1: La flua mapo priskribas malprofundan kopion

En ĉi tiu cifero, La objekto – MainObj1 havas kampon nomita kiel field1 de primitiva tipo diras int, Kaj objekto de tipa Ŝnuro Kiam ni fari malprofundan kopion de mainObj1, MainObj2 estas kreita kun field2 de tipo int kiu enhavas la kopiita valoron de field1 sed la Ŝnura objekto en mainObj2 – Kvietaj punktoj al objStr ĝi mem. Pro tio ke field1 estas primitiva datuma tipo, La valoro de ĝi estas kopiita en field2. Sed pro tio ke objStr estas objekto, MainObj2 estas indikanta al la sama adreso de objStr. Do ajnaj ŝanĝoj farita al objStr tra mainObj1 akiras reflektita en mainObj2.

Efektivigo:

[Kodo]

Enlistiganta 1: Klasifiki SubjectVO.Java priskribas valoran objekton por temoj

Pako Com.Hejme.ObjectCopy;

Publika Klaso SubjectVO {

Privata Ŝnura nomo;

/**

* @Reveno La nomo

*/

Publika Laĉi getName() {

Reveno Nomo;

}

/**

* @Param Nomo

* La nomo fiksi

*/

Publika Malplena SetName(Ŝnura nomo) {

Tio ĉi.Noma = nomo;

}

Publika SubjectVO(Ŝnura nomo) {

Tio ĉi.Noma = nomo;

}

}

[/Kodo]

Enlistiganta 2: Klasifiki PupilVO.Java priskribanta valoran objekton por lernanto

[Kodo]

Pako Com.Hejme.ObjectCopy;

Publika Klaso PupilVO Efektivigas Cloneable {

// Enhavita objekton

Privata SubjectVO subj;

Privata Ŝnura nomo;

/**

* @Reveno La Subj

*/

Publika SubjectVO getSubj() {

Reveno Subj;

}

/**

* @Param Subj

* La Subj Fiksi

*/

Publika Malplena SetSubj(SubjectVO subj) {

Tio ĉi.Subj = subj;

}

/**

* @Reveno La nomo

*/

Publika Laĉi getName() {

Reveno Nomo;

}

/**

* @Param Nomo

* La nomo fiksi

*/

Publika Malplena SetName(Ŝnura nomo) {

Tio ĉi.Noma = nomo;

}

Publika PupilVO(Ŝnura nomo, Laĉi sub) {

Tio ĉi.Noma = nomo;

Tio ĉi.Subj = Nova SubjectVO(Sub);

}

Publika Objekta klono() {

// Malprofunda kopio

Provo {

Reveno Ekstra.Klono();

} Kaptaĵo (CloneNotSupportedException e) {

Reveno Null;

}

}

}

[/Kodo]

Listing3: Klasifiki ShallowCopyTest.Java priskribanta kopian procezon

[Kodo]
Pako Com.Hejme.ObjectCopy;

Publika Klaso ShallowCopyTest {

Publika Senmova Malplena Ĉefa(Ŝnuro[] Args) {

// Originala Objekto

PupilVO kovras = Nova PupilVO(“Johnathan”, “Algebro”);

Sistemo.Ekstere.Println(“Originala Objekto: ” + Kovri.GetName() + ” – ”

+ Kovri.GetSubj().GetName());

// Klona Objekto

PupilVO clonedStud = (PupilVO) Kovri.Klono();

Sistemo.Ekstere.Println(“Klonita Objekton: ” + ClonedStud.GetName() + ” – ”

+ ClonedStud.GetSubj().GetName());

Kovri.SetName(“Daniel”);

Kovri.GetSubj().SetName(“Fizikoj”);

Sistemo.Ekstere.Println(“Originala Objekto post kiam ĝi estas ĝisdatigita: ”

+ Kovri.GetName() + ” – ” + Kovri.GetSubj().GetName());

Sistemo.Ekstere.Println(“Klonita Objekton post ĝisdatiganta originalan objekton: ”

+ ClonedStud.GetName() + ” – ”

+ ClonedStud.GetSubj().GetName());

}

}

[/Kodo]

Eligita: La produktado de ĉi tiu programo estas kiel nesufiĉe

Originala Objekto: Johnathan – Algebro

Klonita Objekton: Johnathan – Algebro

Originala Objekto post kiam ĝi estas ĝisdatigita: Daniel – Fizikoj

Klonita Objekton post ĝisdatiganta originalan objekton: Johnathan – Fizikoj

Ĉi tie ni vidas ke la valoro de la kampa nomo akiras ŝanĝita post la kopia operacio sed la valoro de la objekta temo restas la saman kiel ĝi estas indikanta al la sama memora adreso. Tial la temo por Jonathan fariĝas ‘Fiziko’ Kie kiel ĝi devus esti ‘Algebro’ Kiel la objekto por SubjectVO en la klonita objekton restas senŝanĝan.

Profunda Kopio:

En profunda kopio, Ne nur ĉiuj la kampoj de objekto estas kopiita, Ĉiuj la dynamically asignita memoran adreson kiu estas indikita de tiu objekto estas ankaŭ kopiita.

Deep Cpoy

Profunda Kopio

Cifero 2: La skemo priskribas profundan kopian procezon

En ĉi tiu cifero, La objekto mainObj1 havas kampojn field1 primitiva datuma tipo diras int, Kaj objekto de tipa Ŝnuro Kiam ni fari profundan kopion de mainObj1, MainObj2 estas kreita kun field2 enhavanta la kopiita valoron de field1 kaj objStr2 estas kreita kiun enhavas la kopiita valoron de objStr1 Do ajnaj ŝanĝoj farita al objStr1 en mainObj1 ne reflektos en mainObj2.

Efektivigo:

Listing4: Klasifiki priskribanta profundan kopion

[Kodo]

Pako Com.Hejme.DeepCopy;

Publika Klaso PupilVO Efektivigas Cloneable {

// Enhavita objekton

Privata SubjectVO subj;

Privata Ŝnura nomo;

/**

* @Reveno La Subj

*/

Publika SubjectVO getSubj() {

Reveno Subj;

}

/**

* @Param Subj

* La Subj Fiksi

*/

Publika Malplena SetSubj(SubjectVO subj) {

Tio ĉi.Subj = subj;

}

/**

* @Reveno La nomo

*/

Publika Laĉi getName() {

Reveno Nomo;

}

/**

* @Param Nomo

* La nomo fiksi

*/

Publika Malplena SetName(Ŝnura nomo) {

Tio ĉi.Noma = nomo;

}

Publika PupilVO(Ŝnura nomo, Laĉi sub) {

Tio ĉi.Noma = nomo;

Tio ĉi.Subj = Nova SubjectVO(Sub);

}

Publika Objekta klono() {

// Profunda kopio

PupilVO lernanto = Nova PupilVO(Nomo, Subj.GetName());

Reveno Lernanto;

}

}

[/Kodo]

La nura diferenco inter ĉi tiu alproksimiĝo kaj la pli frua alproksimiĝo estas ke la klona metodo en la PupilVO revenas lastatempe kreita PupilVO objekto. Tio ĉi certigas ke whenever la kopia mekanismo en iniciatita, La objekto SubjectVO ankaŭ akiras ŝanĝita. Profunda kopio havas alternativan alproksimiĝon – Serialization. En serialization, La tuta objekta grafeo estas skribita en persista vendejo kaj legita reen kiam postulita. Tiel whenever ni legis la objekton de la persista vendejo, La originala objekto estas plu-gvidita.

Uzado de malprofunda kopio kaj profunda kopio:

Estas ne malfacila kaj rapida regulo difinita por elektanta inter malprofunda kopio kaj profunda kopio sed normale ni devus teni en menso ke se objekto havas nur primitivajn kampojn, Tiam evidente ni devus iri por malprofunda kopio, Sed se la objekto havas referencojn al aliaj objektoj, Tiam bazita sur la postulo, malprofunda kopio aŭ profunda kopio devus esti farita. Se la referencoj ne estas ĝisdatigita tiam estas neniu punkto iniciati profundan kopion.

Klarigi maldiligentan kopion:

Maldiligenta kopio povas esti difinita kiel kombinaĵo de ambaŭ malprofunda kopio kaj profunda kopio. La mekanismo sekvas simplan alproksimiĝon – Ĉe la komenca stato, Malprofunda kopia alproksimiĝo estas uzita. Sumigilo estas ankaŭ uzita teni vojeton sur kiom da objektoj dividas la datumon. Kiam la programo deziras modifi la originalan objekton, Ĝi kontrolas ĉu la objekto estas dividita aŭ ne. Se la objekto estas dividita, Tiam la profunda kopia mekanismo estas iniciatita.

Resuma:

En malprofunda kopio, Nuraj kampoj de primitiva datuma tipo estas kopiita dum la objektaj referencoj ne estas kopiita. Profunda kopio okupas la kopion de primitiva datuma tipo tiel kiel objet referencoj. Estas ne malfacila kaj rapida regulo kiel al kiam fari malprofundan kopion kaj kiam fari profundan kopion. Maldiligenta kopio estas kombinaĵo de ambaŭ de ĉi tiuj alproksimiĝoj.

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

Enjoy this blog? Please spread the word :)

Follow by Email
LinkedIn
LinkedIn
Share