Diep Kopieer of vlak Kopieer in Java - Hoe om van te kies?

Deep_shallow_copy

Diep kopie en vlak kopie

Oorsig: In hierdie artikel sal ons die proses van kopiëring voorwerpe in Java te bespreek. Die doel van kopiëring kan verskil op grond van die vereiste aansoek. Maar daar is hoofsaaklik twee tipes kopiëring beskikbaar, diep en vlak kopie. Die metode van kopiëring wissel in hierdie twee benaderings.

Inleiding:
Die optrede van die kopiëring van die eienskappe van 'n voorwerp in 'n ander van dieselfde soort data genoem kopie voorwerp. In Java, Ons het die volgende benaderings van kopiëring een voorwerp na 'n ander

  • vlak Kopieer: Hier As die veld wat om gekopieer is 'n primitiewe soort, dan is die waarde is gekopieer anders as die veld wat om gekopieer is 'n geheue adres (of 'n voorwerp self) dan die adres kopieer. Dus, as die adres verander deur een voorwerp, die verandering kry oral weerspieël.
  • diep Kopieer: Hier die data gekopieer in beide die situasies. Hierdie benadering is duurder en stadiger.
  • lui Kopieer: Dit is 'n kombinasie van bogenoemde twee benaderings. Aanvanklik het die vlak kopie benadering word gebruik en dan kyk of die data word gedeel deur baie voorwerpe en die program moet 'n voorwerp verander, die diep kopie benadering word gebruik.

So kan ons die tipe kopiëring gebaseer op die volgende twee voorwaardes kies

  • Gebruik vlak kopiëring wanneer daar geen inkapseling vereis.
  • Gebruik diep kopiëring wanneer inkapseling vereis.

vlak Kopieer:

In vlak kopie, 'n nuwe voorwerp geskep wat die presiese kopie van die waardes in die oorspronklike voorwerp bevat. Vlak kopie volg die bitwise kopie benadering. In vlak kopie As die veld is 'n geheue adres, dan die adres kopieer. Dus, as die adres verander deur een voorwerp, die verandering kry oral weerspieël.

Shallow copy

vlak kopie

Figure 1: Die vloeidiagram beskryf vlak kopie

In hierdie figuur, die voorwerp – mainObj1 het 'n stuk grond genoem as veld1 van 'n primitiewe soort sê int, en 'n voorwerp van tipe String Wanneer ons dit doen 'n vlak afskrif van mainObj1, mainObj2 is geskep met veld2 van tipe int wat die gekopieerde waarde van veld1 maar die String voorwerp in mainObj2 bevat – steeds wys na homself objStr. Sedert veld1 is 'n primitiewe soort data, die waarde daarvan is gekopieer na veld2. Maar sedert objStr is 'n voorwerp, mainObj2 wys na dieselfde adres van objStr. So enige veranderinge aan objStr via mainObj1 ontslae weerspieël in mainObj2.

implementering:

[kode]

Listing 1: Klas SubjectVO.java beskryf waarde voorwerp vir vakke

package com.home.objectCopy;

openbare klas SubjectVO {

private string naam;

/**

* @return die naam

*/

openbare string getName() {

return naam;

}

/**

* param naam

* die naam op te rig

*/

openbare nietig setName(string naam) {

this.name = Naam;

}

openbare SubjectVO(string naam) {

this.name = Naam;

}

}

[/kode]

Listing 2: Klas PupilVO.java beskryf waarde voorwerp vir leerling

[kode]

package com.home.objectCopy;

openbare klas PupilVO implemente Cloneable {

// vervat voorwerp

private SubjectVO subj;

private string naam;

/**

* @return the subj

*/

openbare SubjectVO getSubj() {

return subj;

}

/**

* param subj

* the subj op te rig

*/

openbare nietig setSubj(SubjectVO subj) {

this.subj = subj;

}

/**

* @return die naam

*/

openbare string getName() {

return naam;

}

/**

* param naam

* die naam op te rig

*/

openbare nietig setName(string naam) {

this.name = Naam;

}

openbare PupilVO(string naam, string sub) {

this.name = Naam;

this.subj = nuwe SubjectVO(sub);

}

openbare voorwerp kloon() {

// vlak kopie

probeer {

return super.kloon();

} vang (CloneNotSupportedException e) {

return zero;

}

}

}

[/kode]

Listing3: Klas ShallowCopyTest.java beskryf kopieer proses

[kode]
package com.home.objectCopy;

openbare klas ShallowCopyTest {

openbare statiese nietig hoof(String[] argumente) {

// oorspronklike Object

PupilVO stoet = nuwe PupilVO(“Johnathan”, “algebra”);

Stelsel.uit.println(“oorspronklike Object: ” + stud.getName() + ” – ”

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

// kloon Object

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

Stelsel.uit.println(“gekloon Object: ” + clonedStud.getName() + ” – ”

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

stud.setName(“Daniel”);

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

Stelsel.uit.println(“Oorspronklike Object nadat dit opgedateer: ”

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

Stelsel.uit.println(“Gekloon Object na die werk oorspronklike voorwerp: ”

+ clonedStud.getName() + ” – ”

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

}

}

[/kode]

Uitgawe: Die opbrengs van hierdie program is as onder

oorspronklike Object: Johnathan – algebra

gekloon Object: Johnathan – algebra

Oorspronklike Object nadat dit opgedateer: Daniel – Fisika

Gekloon Object na die werk oorspronklike voorwerp: Johnathan – Fisika

Hier sien ons dat die waarde van die naam veld kry verander na die kopie operasie, maar die waarde van die voorwerp onderworpe bly dieselfde soos dit verwys na dieselfde geheue-posadres. Vandaar die onderwerp vir Jonathan raak 'Fisika’ waar soos dit moet wees 'Algebra’ as die voorwerp vir SubjectVO in die gekloonde voorwerp bly onveranderd.

diep Kopieer:

In diep kopie, nie net al die velde van 'n voorwerp is gekopieer, al die dinamiese toegeken geheue adres wat aangedui word deur die voorwerp is ook gekopieer.

Deep Cpoy

diep Kopieer

Figure 2: Die diagram beskryf diep kopieer proses

In hierdie figuur, die voorwerp mainObj1 het velde veld1 n primitiewe soort data sê int, en 'n voorwerp van tipe String Wanneer ons dit doen 'n diep afskrif van mainObj1, mainObj2 is geskep met veld2 met die gekopieerde waarde van veld1 en objStr2 geskep wat die gekopieerde waarde van objStr1 bevat So enige veranderinge aan objStr1 in mainObj1 sal nie weerspieël in mainObj2.

implementering:

Listing4: Klas beskryf diep kopie

[Code]

package com.home.DeepCopy;

openbare klas PupilVO implemente Cloneable {

// vervat voorwerp

private SubjectVO subj;

private string naam;

/**

* @return the subj

*/

openbare SubjectVO getSubj() {

return subj;

}

/**

* param subj

* the subj op te rig

*/

openbare nietig setSubj(SubjectVO subj) {

this.subj = subj;

}

/**

* @return die naam

*/

openbare string getName() {

return naam;

}

/**

* param naam

* die naam op te rig

*/

openbare nietig setName(string naam) {

this.name = Naam;

}

openbare PupilVO(string naam, string sub) {

this.name = Naam;

this.subj = nuwe SubjectVO(sub);

}

openbare voorwerp kloon() {

// diep kopie

PupilVO leerling = nuwe PupilVO(naam, subj.getName());

return leerling;

}

}

[/kode]

Die enigste verskil tussen hierdie benadering en die vorige benadering is dat die kloon metode in die PupilVO n nuutgeskepte PupilVO voorwerp terug. Dit verseker dat wanneer die kopie meganisme in geïnisieer, die voorwerp SubjectVO kry ook verander. Diep kopie het 'n alternatiewe benadering – serialisasie. in serialisasie, die hele voorwerp grafiek geskryf in 'n aanhoudende winkel en lees terug wanneer dit nodig is. So wanneer ons lees die voorwerp van die aanhoudende winkel, die oorspronklike voorwerp verwys.

Gebruik van vlak kopie en diep kopie:

Daar is geen vaste reël gedefinieer vir die kies van tussen vlak kopie en diep kopie maar gewoonlik moet ons in gedagte hou dat indien 'n voorwerp het net primitiewe velde, dan natuurlik moet ons gaan vir vlak kopie, maar as die voorwerp het verwysings na ander voorwerpe, dan gebaseer op die vereiste, vlak kopie of diep kopie gedoen moet word. As die verwysings nie opgedateer dan is daar geen punt om 'n diep kopie inisieer.

Verduidelik lui kopie:

A lui kopie kan gedefinieer word as 'n kombinasie van beide vlak kopie en diep kopie. Die meganisme volg 'n eenvoudige benadering – by die aanvanklike toestand, vlak kopie benadering word gebruik. 'N toonbank word ook gebruik om 'n spoor van hoeveel voorwerpe deel die data bewaar. Wanneer die program wil die oorspronklike voorwerp verander, dit kontroleer of die voorwerp nie gedeel word of. As die voorwerp gedeel, dan die diep kopie meganisme is 'n inisiatief.

Summary:

In vlak kopie, net velde van primitiewe tipe data gekopieer terwyl die voorwerpe verwysings nie gekopieer. Diep kopie behels die afskrif van primitiewe tipe data sowel as objet verwysings. Daar is geen vaste reël oor wanneer om vlak kopie doen en wanneer om 'n diep kopie doen. Lui kopie is 'n kombinasie van beide van hierdie benaderings.

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