Süvakopeerimine või madalas koopia Java - Kuidas valida?

Deep_shallow_copy

Süvakopeerimine ja madalas koopia

Ülevaade: Selles artiklis me arutada protsessi kopeerimise objektide java. Eesmärk kopeerimine võib olla erinev avalduse alusel nõuet. Kuid on peamiselt kahte tüüpi kopeerimine saadaval, sügav ja madalas koopia. Meetod vastavalt kopeerimise varieerub neist kahest meetodist.

Sissejuhatus:
Tegevus kopeerida atribuutide üks objekt teise sama andmetüübi nimetatakse objekti koopia. Java, meil järgmised lähenemisviise kopeerimise üks objekt teise

  • madalas koopia: Siin kui väli, mis tuleb kopeerida on algupärased tõud, siis väärtus kopeeritakse teine, kui valdkonnas, mis tuleb kopeerida on mälu aadress (või objekt ise) siis aadress on kopeeritud. Seega juhul kui aadress on muutunud ühe objekti, muutus saab kajastub kõikjal.
  • Süvakopeerimine: Siin andmeid kopeerida nii olukordades. Selline lähenemine on kallim ja aeglasem.
  • Lazy Copy: See on kombinatsioon eespool kahte lähenemist. Esialgu madalas koopia lähenemist kasutatakse ning seejärel kontrollida, kas andmed on jagatud paljude objektide ja programm vajab muuta objekti, sügav koopia lähenemist kasutatakse.

Nii saame valida, millist tüüpi kopeerimise aluseks on järgmised kaks tingimust

  • Kasutage pinnapealne kopeerimist, kui ei kapseldus on vajalik.
  • Kasutage sügavat Kopeerimine kapseldus on vajalik.

madalas koopia:

Madalas koopia, uus objekt on loodud, mis sisaldab täpset koopiat väärtused algse objekti. Madalas koopia järgib bittipidi koopia lähenemist. Madalas koopia, kui valdkonnas on mälu aadress, siis aadress on kopeeritud. Seega juhul kui aadress on muutunud ühe objekti, muutus saab kajastub kõikjal.

Shallow copy

madalas koopia

Figure 1: Blokkskeemiga kirjeldab madalas koopia

Sellel joonisel, objekti – mainObj1 on valdkonnas nimeks field1 primitiivne tüübile öelda int, ja objekti tüübiga String Kui me madalas koopia mainObj1, mainObj2 on loodud field2 tüüpi int, mis sisaldab kopeeritud väärtus field1 kuid String objekt mainObj2 – osutab endiselt objStr ise. Kuna field1 on primitiivne andmetüüp, väärtus on kopeeritud field2. Aga kuna objStr on objekt, mainObj2 on suunatud samale aadress objStr. Nii tehtud muudatused objStr kaudu mainObj1 saada kajastub mainObj2.

täitmine:

[kood]

Listing 1: Klass SubjectVO.java kirjeldab väärtust objekti teemasid

package com.home.objectCopy;

avalik klass SubjectVO {

era- String name;

/**

* @return nimi

*/

avalik string getName() {

return nimi;

}

/**

* @ param nimi

* nime seada

*/

avalik tühine setName(String name) {

see.name = nimi;

}

avalik SubjectVO(String name) {

see.name = nimi;

}

}

[/kood]

Listing 2: Klass PupilVO.java kirjeldab väärtust objekti õpilane

[kood]

package com.home.objectCopy;

avalik klass PupilVO töövahendid Cloneable {

// sisalduvate eseme

era- SubjectVO SUBJ;

era- String name;

/**

* @return the SUBJ

*/

avalik SubjectVO getSubj() {

return SUBJ;

}

/**

* @ param SUBJ

* the SUBJ seadma

*/

avalik tühine setSubj(SubjectVO SUBJ) {

see.SUBJ = SUBJ;

}

/**

* @return nimi

*/

avalik string getName() {

return nimi;

}

/**

* @ param nimi

* nime seada

*/

avalik tühine setName(String name) {

see.name = nimi;

}

avalik PupilVO(String name, string sub) {

see.name = nimi;

see.SUBJ = uus SubjectVO(sub);

}

avalik objekti kloon() {

// madalas koopia

püüdma {

return super.kloon();

} saak (CloneNotSupportedException e) {

return null;

}

}

}

[/kood]

Listing3: Klass ShallowCopyTest.java kirjeldab koopia protsessi

[kood]
package com.home.objectCopy;

avalik klass ShallowCopyTest {

avalik staatiline tühine põhiline(String[] args) {

// Original objekt

PupilVO stud = uus PupilVO(“Johnathan”, “algebra”);

Süsteem.välja.println(“Original objekt: ” + stud.getName() + ” – ”

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

// Kloonide objekt

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

Süsteem.välja.println(“kloonitud objekt: ” + clonedStud.getName() + ” – ”

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

stud.setName(“Daniel”);

stud.getSubj().setName(“Füüsika”);

Süsteem.välja.println(“Original Object pärast seda on ajakohastatud: ”

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

Süsteem.välja.println(“Kloonitud Object pärast ajakohastamist algse objekti: ”

+ clonedStud.getName() + ” – ”

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

}

}

[/kood]

väljund: Väljund on see programm on nii all

Original objekt: Johnathan – algebra

kloonitud objekt: Johnathan – algebra

Original Object pärast seda on ajakohastatud: Daniel – Füüsika

Kloonitud Object pärast ajakohastamist algse objekti: Johnathan – Füüsika

Siin näeme, et väärtus välja nime saab muuta pärast Kopeerimisvaatest kuid eseme väärtus teema jääb samaks nagu see viitab sama mälu aadress. Seega teema Jonathan muutub "Füüsika’ kus nagu see peaks olema "Algebra’ nagu objekti SubjectVO kloonitud objekti jääb muutumatuks.

Süvakopeerimine:

Sügavas koopia, mitte ainult kõik väljad objekti kopeeritakse, kõik dünaamiliselt eraldatud mälu aadress, mida juhtis selle objekti ka kopeerida.

Deep Cpoy

Süvakopeerimine

Figure 2: Skeem kirjeldab Süvakopeerimine protsessi

Sellel joonisel, objekti mainObj1 on väljad field1 primitiivne andmetüüp öelda int, ja objekti tüübiga String Kui me seda teeme sügava koopia mainObj1, mainObj2 on loodud field2 mis sisaldab kopeeritud väärtus field1 ja objStr2 on loodud, mis sisaldab kopeeritud väärtus objStr1 Nii tehtavad muudatused objStr1 in mainObj1 ei kajasta mainObj2.

täitmine:

Listing4: Klass kirjeldab Süvakopeerimine

[Code]

package com.home.DeepCopy;

avalik klass PupilVO töövahendid Cloneable {

// sisalduvate eseme

era- SubjectVO SUBJ;

era- String name;

/**

* @return the SUBJ

*/

avalik SubjectVO getSubj() {

return SUBJ;

}

/**

* @ param SUBJ

* the SUBJ seadma

*/

avalik tühine setSubj(SubjectVO SUBJ) {

see.SUBJ = SUBJ;

}

/**

* @return nimi

*/

avalik string getName() {

return nimi;

}

/**

* @ param nimi

* nime seada

*/

avalik tühine setName(String name) {

see.name = nimi;

}

avalik PupilVO(String name, string sub) {

see.name = nimi;

see.SUBJ = uus SubjectVO(sub);

}

avalik objekti kloon() {

// Süvakopeerimine

PupilVO õpilane = uus PupilVO(nimi, subj.getName());

return õpilane;

}

}

[/kood]

Ainus vahe selline lähenemine ja varasem lähenemine on see, et kloon meetodit PupilVO naaseb uue PupilVO objekti. See tagab, et iga kord, kui koopia mehhanism algatatud, objekti SubjectVO saab ka muuta. Süvakopeerimine on alternatiivset lähenemist – sariväljaanne. Serialiseerimisplokis, kogu objekti graafik kirjutatakse püsiv salvestada ja lugeda tagasi, kui vaja. Nii et kui me loeme objekti püsiv poest, algse objekti nimetatakse.

Kasutamine madalas koopia ja sügav koopia:

Ei ole raske ja kiire reegel määratletud valiku vahel madalas koopia ja sügav koopia, kuid tavaliselt me ​​peaksime meeles pidama, et kui objekt on vaid primitiivne väljad, siis ilmselt me ​​peaks minema madalas koopia, aga kui objektil on viited muude objektide, Seejärel, lähtudes vajadusest, madalas koopia või sügava koopia tuleb teha. Kui viiteid ei uuendata, siis ei ole mõtet algatada Süvakopeerimine.

Selgitage laisk koopia:

Laisk koopia võib defineerida kui mõlema kombinatsioon madalas koopia ja sügav koopia. Mehhanism järgmiselt lihtne lähenemine – esialgses olekus, madalas koopia lähenemist kasutatakse. Loendur kasutatakse ka hoida silma peal, kui palju objekte jagada andmeid. Kui programm tahab muuta algse objekti, siis kontrolli, kas objekt on jagatud või mitte. Kui objekt on jagatud, siis Süvakopeerimine mehhanism on algatatud.

Summary:

Madalas koopia, Ainult väljad primitiivne andmetüüp on kopeeritud samas objektid viiteid ei kopeerita. Süvakopeerimine hõlmab koopia primitiivne andmetüüp samuti objet viited. Ei ole raske ja kiire reegel, et kui teha madalas koopia ja millal seda teha sügav koopia. Lazy koopia on kombinatsioon mõlemad lähenemised.

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