Deep Kopier eller Lavt Copy i Java - Sådan vælger?

Deep_shallow_copy

Dybt kopi og overfladisk kopi

Oversigt: I denne artikel vil vi diskutere processen med at kopiere objekter i java. Formålet med kopiering kan anderledes baseret på kravet ansøgning. Men der er primært to typer af kopiering til rådighed, dybe og lavvandede kopi. Fremgangsmåden til kopiering varierer i disse to tilgange.

Indledning:
Virkningen af ​​at kopiere attributterne for et objekt til et andet af samme datatype kaldes objekt kopi. I java, har vi følgende metoder af kopiering ét objekt i en anden

  • Shallow Copy: Her hvis feltet, der skal kopieres er en primitiv form, så værdien kopieres else if for området, som skal kopieres er en hukommelsesadresse (eller et objekt selv) derefter adressen kopieres. Således hvis adressen ændres med ét objekt, ændringen bliver afspejlet overalt.
  • Deep Copy: Her dataene er kopieret i begge de situationer. Denne fremgangsmåde er dyrere og langsommere.
  • Lazy Copy: Dette er en kombination af de to ovennævnte tilgange. Oprindeligt lavvandede kopi fremgangsmåde er brugt, og derefter kontrolleres, hvis dataene deles af mange objekter og programmet skal ændre et objekt, anvendes den dybe kopi tilgang.

Så vi kan vælge den type kopiering baseret på følgende to betingelser

  • Brug overfladisk kopiering, når der ikke indkapsling er påkrævet.
  • Brug deep kopiering når indkapsling er påkrævet.

Shallow Copy:

I lavvandede kopi, et nyt objekt oprettes som indeholder nøjagtig kopi af værdierne i det oprindelige objekt. Shallow kopi følger bit-wise kopi tilgang. I lavvandede kopi, hvis feltet er en hukommelse adresse, derefter adressen kopieres. Således hvis adressen ændres med ét objekt, ændringen bliver afspejlet overalt.

Shallow copy

Shallow kopi

Figure 1: Rutediagrammet beskriver overfladisk kopi

I denne figur, objektet – mainObj1 har et felt navngivet som Felt1 af en primitiv form siger int, og et objekt af typen String Når vi gør en lavvandet kopi af mainObj1, mainObj2 er skabt med området2 af typen int, der indeholder den kopierede værdi Felt1 men String objekt i mainObj2 – stadig peger på objStr selv. Da Felt1 er en primitiv datatype, værdien af ​​det er kopieret ind i området2. Men da objStr er et objekt, mainObj2 peger på den samme adresse objStr. Så eventuelle ændringer objStr via mainObj1 få afspejlet i mainObj2.

Implementering:

[kode]

Listing 1: Klasse SubjectVO.java beskriver værdi objekt for fag

package com.home.objectCopy;

offentlige klasse SubjectVO {

private String name;

/**

* @return navnet

*/

offentlige String getNavn() {

return navn;

}

/**

* @param navn

* navnet for at indstille

*/

offentlige ugyldig setName(String name) {

denne.name = navn;

}

offentlige SubjectVO(String name) {

denne.name = navn;

}

}

[/kode]

Listing 2: Klasse PupilVO.java beskriver værdi objekt for elev

[kode]

package com.home.objectCopy;

offentlige klasse PupilVO redskaber Cloneable {

// indeholdt objekt

private SubjectVO subj;

private String name;

/**

* @return the subj

*/

offentlige SubjectVO getSubj() {

return subj;

}

/**

* @param subj

* the subj at indstille

*/

offentlige ugyldig setSubj(SubjectVO subj) {

denne.subj = subj;

}

/**

* @return navnet

*/

offentlige String getNavn() {

return navn;

}

/**

* @param navn

* navnet for at indstille

*/

offentlige ugyldig setName(String name) {

denne.name = navn;

}

offentlige PupilVO(String name, String sub) {

denne.name = navn;

denne.subj = nye SubjectVO(sub);

}

offentlige Objekt-klon() {

// lavvandede kopi

prøv {

return super.klon();

} fange (CloneNotSupportedException e) {

return nul;

}

}

}

[/kode]

Listing3: Klasse ShallowCopyTest.java beskriver kopi proces

[kode]
package com.home.objectCopy;

offentlige klasse ShallowCopyTest {

offentlige statiske ugyldig main(String[] args) {

// Original Object

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

System.ud.println(“Original Object: ” + stud.getName() + ” – ”

+ stud.getSubj().getNavn());

// Klon Object

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

System.ud.println(“klonede Object: ” + clonedStud.getName() + ” – ”

+ clonedStud.getSubj().getNavn());

stud.setName(“Daniel”);

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

System.ud.println(“Original Object efter det er opdateret: ”

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

System.ud.println(“Klonede Object efter opdatering oprindelige objekt: ”

+ clonedStud.getName() + ” – ”

+ clonedStud.getSubj().getNavn());

}

}

[/kode]

Produktion: Resultatet af dette program er som under

Original Object: Johnathan – Algebra

klonede Object: Johnathan – Algebra

Original Object efter det er opdateret: Daniel – Fysik

Klonede Object efter opdatering oprindelige objekt: Johnathan – Fysik

Her ser vi, at værdien af ​​navnet feltet bliver ændret efter kopieringen, men værdien af ​​objektet emnet forbliver den samme, som den peger på den samme hukommelse adresse. Derfor emne for Jonathan bliver 'Fysik’ hvor som det skal være 'Algebra’ som genstand for SubjectVO i den klonede objekt forbliver uændret.

Deep Copy:

I dyb kopi, ikke blot alle områderne et objekt kopieres, alle de dynamisk allokerede hukommelse adresse som peger af den pågældende genstand også kopieret.

Deep Cpoy

Deep Copy

Figure 2: Diagrammet beskriver dyb kopi proces

I denne figur, objektet mainObj1 har felter Felt1 en primitiv datatype siger int, og et objekt af typen String Når vi gør en dyb kopi af mainObj1, mainObj2 er skabt med området2 indeholder den kopierede værdi Felt1 og objStr2 er skabt, som indeholder den kopierede værdi objStr1 Så eventuelle ændringer objStr1 i mainObj1 vil afvige i mainObj2.

Implementering:

Listing4: Klasse beskriver dyb kopi

[Code]

package com.home.DeepCopy;

offentlige klasse PupilVO redskaber Cloneable {

// indeholdt objekt

private SubjectVO subj;

private String name;

/**

* @return the subj

*/

offentlige SubjectVO getSubj() {

return subj;

}

/**

* @param subj

* the subj at indstille

*/

offentlige ugyldig setSubj(SubjectVO subj) {

denne.subj = subj;

}

/**

* @return navnet

*/

offentlige String getNavn() {

return navn;

}

/**

* @param navn

* navnet for at indstille

*/

offentlige ugyldig setName(String name) {

denne.name = navn;

}

offentlige PupilVO(String name, String sub) {

denne.name = navn;

denne.subj = nye SubjectVO(sub);

}

offentlige Objekt-klon() {

// dyb kopi

PupilVO elev = nye PupilVO(navn, subj.getName());

return elev;

}

}

[/kode]

Den eneste forskel mellem denne metode og den tidligere tilgang er, at klonen metoden i PupilVO returnerer en nyoprettet PupilVO objekt. Dette sikrer, at når kopien mekanisme initieret, objektet SubjectVO bliver også ændret. Deep kopi har en alternativ fremgangsmåde – serialisering. I serialisering, hele genstanden graf skrives ind i en vedvarende butik og læses tilbage, når det kræves. Så når vi læser objektet fra vedvarende butik, det originale objekt er nævnt.

Brug af lavvandede kopi og dyb kopi:

Der er ingen ufravigelig regel defineret for at vælge mellem lavvandede kopi og dyb kopi, men normalt vi skal huske på, at hvis en genstand har kun primitive felter, så selvfølgelig bør vi gå til lavvandede kopi, men hvis objektet har referencer til andre objekter, derefter baseret på kravet, lavvandede kopi eller dyb kopi bør ske. Hvis referencerne ikke opdateres så der er ingen mening at indlede en dyb kopi.

Forklar doven kopi:

En doven kopi kan defineres som en kombination af begge lavvandede kopi og dyb kopi. Mekanismen følger en enkel tilgang – ved den oprindelige tilstand, anvendes lavvandede kopi tilgang. En tæller bruges også til at holde styr på, hvor mange objekter deler data. Når programmet ønsker at ændre den oprindelige objekt, den kontrollerer, om objektet er delt eller ikke. Hvis objektet er delt, derefter den dybe kopi mekanisme initieres.

Summary:

I lavvandede kopi, kun inden for primitiv datatype kopieres mens objekter referencer ikke kopieres. Deep kopi involverer kopi af primitive datatype samt Objet referencer. Der er ingen ufravigelig regel om, hvornår man skal gøre overfladisk kopiere og hvornår man skal gøre en dyb kopi. Dovne kopi er en kombination af begge disse tilgange.

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