Copy thellë ose cekët Copy në Java - Si te zgjidhni?

Deep_shallow_copy

kopje të thellë dhe të cekët kopje

Përmbledhje: Në këtë artikull ne do të diskutojmë procesin e kopjimit objektet në java. Qëllimi i kopjimit mund të bazohet ndryshme në kërkesat e aplikimit. Por ka kryesisht dy lloje të kopjimit në dispozicion, kopje të thellë dhe të cekët. Metoda e kopjimit ndryshon në këto dy mënyra,.

Parathënie:
Veprimi i kopjimit atributet e një objekt në një tjetër të të njëjtit lloj të të dhënave quhet kopje objekt. Në java, ne kemi metodat e mëposhtme të kopjimit një objekt në një tjetër

  • Copy cekët: Këtu në qoftë se fusha e cila është për të kopjohet është një lloj primitive, atëherë vlera kopjohet tjetër në qoftë se fusha e cila është për të kopjohet është një adresë e kujtesës (ose një objekt në vetvete) atëherë adresa është e kopjuar. Kështu në qoftë se adresa është ndryshuar nga një objekt, ndryshimi merr pasqyrohet kudo.
  • Copy thellë: Këtu të dhënat kopjuar në të dyja situatat. Kjo qasje është costlier dhe të ngadalshëm.
  • Lazy Copy: Kjo është një kombinim i dy metodave të mësipërme. Fillimisht qasja cekët kopja është përdorur dhe pastaj kontrollohet nëse të dhënat është e ndarë nga shumë objekte dhe programi ka nevojë për të modifikuar një objekt, qasja e thellë kopje është përdorur.

Pra, ne mund të zgjidhni llojin e kopjimit në bazë të dy kushtet e mëposhtme

  • Përdorni kopjimin cekët kur nuk encapsulation është e nevojshme.
  • Përdorni kopjimin thellë kur encapsulation është e nevojshme.

Copy cekët:

Në kopje të cekët, një objekt i ri është krijuar e cila përmban një kopje e saktë e vlerave në objektin fillestar. kopje cekët ndjek metodën kopje bit-i mençur. Në kopje të cekët nëse fusha është një adresë e kujtesës, atëherë adresa është e kopjuar. Kështu në qoftë se adresa është ndryshuar nga një objekt, ndryshimi merr pasqyrohet kudo.

Shallow copy

kopje cekët

Figure 1: Grafiku rrjedha përshkruan kopje të cekët

Në këtë shifër, objekt – mainObj1 ka një fushë të quajtur si field1 e një lloj primitiv thonë int, dhe një objekt të tipit String Kur bëjmë një kopje të cekët mainObj1, mainObj2 është krijuar me field2 e tipit int që përmban vlerën e kopjuar e field1 por objektin String në mainObj2 – ende tregon objStr veten. Që field1 është një lloj i të dhënave primitive, vlera e tij është kopjuar në field2. Por që objStr është një objekt, mainObj2 është duke treguar të njëjtën adresë e objStr. Pra, çdo ndryshim i bërë me anë të objStr mainObj1 të pasqyrohet në mainObj2.

zbatim:

[kod]

Listing 1: Class SubjectVO.java përshkruan objektin vlerë për lëndët

package com.home.objectCopy;

publik klasë SubjectVO {

privat Emri string;

/**

* @return Emri

*/

publik string getName() {

return emër;

}

/**

* @param emër

* emri për të vendosur

*/

publik pavlefshme setName(Emri string) {

this.name = Emri;

}

publik SubjectVO(Emri string) {

this.name = Emri;

}

}

[/kod]

Listing 2: Class PupilVO.java përshkruar objektin vlerë për nxënës

[kod]

package com.home.objectCopy;

publik klasë PupilVO orendi Cloneable {

// objekti përmbante

privat SubjectVO Subj;

privat Emri string;

/**

* @return the Subj

*/

publik SubjectVO getSubj() {

return Subj;

}

/**

* @param Subj

* the Subj për të vendosur

*/

publik pavlefshme setSubj(SubjectVO Subj) {

this.Subj = Subj;

}

/**

* @return Emri

*/

publik string getName() {

return emër;

}

/**

* @param emër

* emri për të vendosur

*/

publik pavlefshme setName(Emri string) {

this.name = Emri;

}

publik PupilVO(Emri string, string sub) {

this.name = Emri;

this.Subj = i ri SubjectVO(sub);

}

publik objekti klon() {

// kopje cekët

mundohem {

return super.klon();

} kap (CloneNotSupportedException e) {

return zero;

}

}

}

[/kod]

Listing3: Class ShallowCopyTest.java përshkruar procesin kopje

[kod]
package com.home.objectCopy;

publik klasë ShallowCopyTest {

publik i pandryshueshëm pavlefshme kryesor(Varg[] args) {

// Original Object

PupilVO kurvar = i ri PupilVO(“Johnathan”, “algjebër”);

Sistem.jashtë.println(“Original Object: ” + stud.getName() + ” – ”

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

// Objekti Clone

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

Sistem.jashtë.println(“klonuar Object: ” + clonedStud.getName() + ” – ”

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

stud.setName(“Daniel”);

stud.getSubj().setName(“fizikë”);

Sistem.jashtë.println(“Objekti origjinale, pasi ajo është përditësuar: ”

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

Sistem.jashtë.println(“Objekti klonuar pas përditësimit objekt origjinale: ”

+ clonedStud.getName() + ” – ”

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

}

}

[/kod]

prodhim: Prodhimi i këtij programi është si në

Original Object: Johnathan – algjebër

klonuar Object: Johnathan – algjebër

Objekti origjinale, pasi ajo është përditësuar: Daniel – fizikë

Objekti klonuar pas përditësimit objekt origjinale: Johnathan – fizikë

Këtu ne shohim se vlera e emrit në terren merr ndryshuar pas operacionit kopje, por vlera e subjektit objekt mbetet e njëjtë si ajo është duke treguar të njëjtën adresë e kujtesës. Prandaj subjekt për Jonatanin, bëhet 'Fizikë’ ku si ajo duhet të jetë "Algjebra’ si objekt për SubjectVO në objektin klonuar mbetet i pandryshuar.

Copy thellë:

Në kopje të thellë, jo vetëm të gjitha fushat e një objekti janë kopjuar, gjitha adresojnë ndarë dinamike e kujtesës e cila është vënë në atë objekt është e kopjuar edhe.

Deep Cpoy

Copy thellë

Figure 2: Diagrama e përshkruan procesin e thellë kopje

Në këtë shifër, objekti mainObj1 ka fusha field1 një lloj i të dhënave primitive thonë int, dhe një objekt të tipit String Kur bëjmë një kopje të thellë të mainObj1, mainObj2 është krijuar me field2 përmban vlerën e kopjuar e field1 dhe objStr2 është krijuar e cila përmban vlerën e kopjuar e objStr1 Pra, çdo ndryshim i bërë të objStr1 në mainObj1 nuk do të reflektojë në mainObj2.

zbatim:

Listing4: Class përshkruar kopje të thellë

[Code]

package com.home.DeepCopy;

publik klasë PupilVO orendi Cloneable {

// objekti përmbante

privat SubjectVO Subj;

privat Emri string;

/**

* @return the Subj

*/

publik SubjectVO getSubj() {

return Subj;

}

/**

* @param Subj

* the Subj për të vendosur

*/

publik pavlefshme setSubj(SubjectVO Subj) {

this.Subj = Subj;

}

/**

* @return Emri

*/

publik string getName() {

return emër;

}

/**

* @param emër

* emri për të vendosur

*/

publik pavlefshme setName(Emri string) {

this.name = Emri;

}

publik PupilVO(Emri string, string sub) {

this.name = Emri;

this.Subj = i ri SubjectVO(sub);

}

publik objekti klon() {

// kopje të thellë

PupilVO nxënës = i ri PupilVO(emër, subj.getName());

return nxënës;

}

}

[/kod]

I vetmi ndryshim midis kësaj qasje dhe qasje më të hershme është se metoda klon në PupilVO kthen një objekt të krijuar rishtazi PupilVO. Kjo siguron që kur mekanizmi kopje në iniciuar, objekti SubjectVO gjithashtu merr ndryshuar. kopje të thellë ka një qasje alternative – serialization. në serialization, e tërë grafik objekti është shkruar në një dyqan të vazhdueshme dhe të lexoni mbrapa kur kërkohet. Pra, sa herë që ne lexojmë objektin nga dyqani vazhdueshme, objekti origjinal është referuar.

Përdorimi i kopjes cekët dhe kopje të thellë:

Nuk ka asnjë rregull të vështirë dhe të shpejtë të përcaktuara për përzgjedhjen midis kopje të cekët dhe kopje të thellë, por normalisht duhet të mbani në mend se në qoftë se një objekt ka fusha vetëm primitive, atëherë padyshim që duhet të shkoni për kopje të cekët, por në qoftë se objekti ka referenca për objekte të tjera, atëherë bazuar në kërkesën, kopje cekët ose kopja e thellë duhet të bëhet. Nëse referencat nuk janë përditësuar, atëherë nuk ka asnjë pikë për të filluar një kopje të thellë.

Shpjegoni kopje dembel:

Një kopje dembel mund të përkufizohet si një kombinim i dy kopje të cekët dhe kopje të thellë. Mekanizmi ndjek një qasje të thjeshtë – në gjendjen fillestare, Qasja cekët kopje është përdorur. Një counter është përdorur edhe për të mbajtur një udhë mbi atë se si shumë objekte të ndarë të dhënat e. Kur programi do të ndryshojë objektin origjinale, ajo kontrollon nëse objekti është e ndarë apo jo. Nëse objekti është e përbashkët, atëherë mekanizmi thellë kopje iniciohet.

Summary:

Në kopje të cekët, vetëm fushat e tipit të të dhënave primitive kopjohen ndërsa objekte referencat nuk janë kopjuar. kopje të thellë përfshin kopje të llojit të të dhënave primitive, si dhe referenca objet. Nuk ka asnjë rregull të vështirë dhe të shpejtë se kur për të bërë kopje të cekët dhe kur për të bërë një kopje të thellë. kopje Lazy është një kombinim i të dyja këto qasje.

Tagged në:
============================================= ============================================== Buy best TechAlpine Books on Amazon
============================================== ---------------------------------------------------------------- electrician ct chestnutelectric
error

Enjoy this blog? Please spread the word :)

Follow by Email
LinkedIn
LinkedIn
Share