Hluboko Copy nebo mělké kopie v Javě - Jak si vybrat?

Deep_shallow_copy

Hluboké kopírování a mělké kopie

Přehled: V tomto článku se budeme diskutovat proces kopírování objektů v Javě. Účelem kopírování může být odlišný na základě požadavku aplikačním. Ale jsou to zejména dva typy kopírování k dispozici, hluboké a mělké kopie. Způsob kopírování se liší v těchto dvou přístupů.

Úvod:
Působení kopírovat atributy jednoho objektu do druhého stejného typu dat, se nazývá objekt kopie. V Javě, máme tyto přístupy kopírování jednoho objektu do druhého

  • mělké Copy: Zde v případě, že oblast, která má být kopírován je primitivní typ, pak se hodnota zkopírován jinak v případě, že oblast, která má být kopírován je adresa paměti (nebo samotný objekt) pak je adresa se zkopíruje. Tedy v případě, že adresa se mění jeden objekt, změna projeví dostane všude.
  • hluboká Copy: Zde se data zkopírují v obou případech. Tento přístup je nákladnější a pomalejší.
  • Lazy Copy: Jedná se o kombinaci dvou výše uvedených přístupů. Zpočátku se používá mělké přístup kopírování a potom zkontrolovat, zda jsou data sdílí mnoho objektů a program musí upravit objekt, hluboké přístup je používáno kopírování.

Takže můžeme zvolit typ kopírování na základě následujících dvou podmínek

  • Používejte mělké kopírování pokud není vyžadováno zapouzdření.
  • Použijte hluboké kopírování, když je vyžadováno zapouzdření.

mělké Copy:

V mělké kopie, nový objekt je vytvořen, který obsahuje přesnou kopii hodnot v původním objektu. Mělké kopie následuje kopírování přístup bitové. V mělké kopie v případě, že pole je adresa paměti, pak je adresa se zkopíruje. Tedy v případě, že adresa se mění jeden objekt, změna projeví dostane všude.

Shallow copy

mělké kopie

Figure 1: Vývojový diagram popisuje mělkou kopii

Na tomto obrázku, objekt – mainObj1 má pole s názvem pole1 jako primitivního typu říci int, a objekt typu String Když uděláme mělkou kopii mainObj1, mainObj2 je vytvořen s oblasti2 typu int, která obsahuje zkopírovaný hodnotu pole1 ale objekt řetězec v mainObj2 – stále odkazuje na sebe objStr. Vzhledem k tomu, field1 je primitivní datový typ, Vzhledem k tomu, field1 je primitivní datový typ. Ale protože objStr je objekt, mainObj2 ukazuje na stejnou adresu objStr. Takže všechny změny provedené na objStr přes mainObj1 dostat odráží v mainObj2.

uskutečnění:

[kód]

Listing 1: Třída SubjectVO.java popisuje hodnota objektu pro subjekty

package com.home.objectCopy;

veřejnost třída SubjectVO {

soukromý String name;

/**

* @vrátit se název

*/

veřejnost řetězec getName() {

return jméno;

}

/**

* @param jméno

* název nastavení

*/

veřejnost zrušit setName(String name) {

tento.name = název;

}

veřejnost SubjectVO(String name) {

tento.name = název;

}

}

[/kód]

Listing 2: Třída PupilVO.java popisující hodnota objektu pro žáka

[kód]

package com.home.objectCopy;

veřejnost třída PupilVO nářadí Cloneable {

// obsahovala objekt

soukromý SubjectVO subj;

soukromý String name;

/**

* @vrátit se the subj

*/

veřejnost SubjectVO getSubj() {

return subj;

}

/**

* @param subj

* the subj nastavit

*/

veřejnost zrušit setSubj(SubjectVO subj) {

tento.subj = subj;

}

/**

* @vrátit se název

*/

veřejnost řetězec getName() {

return jméno;

}

/**

* @param jméno

* název nastavení

*/

veřejnost zrušit setName(String name) {

tento.name = název;

}

veřejnost PupilVO(String name, string sub) {

tento.name = název;

tento.subj = nový SubjectVO(sub);

}

veřejnost clone Object() {

// mělké kopie

zkusit {

return Super.klon();

} úlovek (CloneNotSupportedException e) {

return nula;

}

}

}

[/kód]

Listing3: Třída ShallowCopyTest.java popisující proces kopírování

[kód]
package com.home.objectCopy;

veřejnost třída ShallowCopyTest {

veřejnost statický zrušit hlavní(Řetěz[] args) {

// původní objekt

PupilVO stud = nový PupilVO(“Johnathan”, “Algebra”);

Systém.ven.System.out.println(“původní objekt: ” + stud.getName() + ” – ”

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

// klon Object

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

Systém.ven.System.out.println(“klonovaný objekt: ” + clonedStud.getName() + ” – ”

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

stud.setName(“Daniel”);

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

Systém.ven.System.out.println(“Původní objekt poté, co je aktualizován: ”

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

Systém.ven.System.out.println(“Klonovaný objekt po aktualizaci původní objekt: ”

+ clonedStud.getName() + ” – ”

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

}

}

[/kód]

Výstup: Výstup z tohoto programu je v rámci

původní objekt: Johnathan – Algebra

klonovaný objekt: Johnathan – Algebra

Původní objekt poté, co je aktualizován: Daniel – Fyzika

Klonovaný objekt po aktualizaci původní objekt: Johnathan – Fyzika

Zde je vidět, že hodnota názvu pole dostane se změnila po operaci kopírování ale hodnota předmětu objektu zůstává stejná, jak to ukazuje na stejnou adresu paměti. Proto je předmětem Jonathanovi se stává "Fyzika’ kde jako by to mělo být "Algebra’ jako objekt pro SubjectVO v klonované objektu se nemění.

hluboká Copy:

V hlubokém kopii, nejen všechna pole objektu jsou zkopírovány, všechny dynamicky přidělené paměti adresa, která je zaměřena tímto objektem je také zkopírován.

Deep Cpoy

hluboká Copy

Figure 2: Diagram popisuje hluboký proces kopírování

Na tomto obrázku, Objekt má mainObj1 polí field1 primitivní datový typ říkají int, a objekt typu String Když uděláme hlubokou kopii mainObj1, mainObj2 je vytvořen s field2 obsahující zkopírovaný hodnotu pole1 a je vytvořen objStr2, který obsahuje zkopírovaný hodnotu objStr1 Takže všechny změny provedené v objStr1 mainObj1 se neodrazí v mainObj2.

uskutečnění:

Listing4: Class popisující hlubokou kopii

[Code]

package com.home.DeepCopy;

veřejnost třída PupilVO nářadí Cloneable {

// obsahovala objekt

soukromý SubjectVO subj;

soukromý String name;

/**

* @vrátit se the subj

*/

veřejnost SubjectVO getSubj() {

return subj;

}

/**

* @param subj

* the subj nastavit

*/

veřejnost zrušit setSubj(SubjectVO subj) {

tento.subj = subj;

}

/**

* @vrátit se název

*/

veřejnost řetězec getName() {

return jméno;

}

/**

* @param jméno

* název nastavení

*/

veřejnost zrušit setName(String name) {

tento.name = název;

}

veřejnost PupilVO(String name, string sub) {

tento.name = název;

tento.subj = nový SubjectVO(sub);

}

veřejnost clone Object() {

// hluboká kopie

PupilVO žák = nový PupilVO(jméno, subj.getName());

return žák;

}

}

[/kód]

Jediný rozdíl mezi tímto přístupem a starší řešení je, že metoda klon v PupilVO vrací nově vytvořený objekt PupilVO. Tím je zajištěno, že vždy, když je kopie mechanismus zahájen, Objekt SubjectVO také dostane ke změně. Hluboká kopie má jiný přístup – serialization. v serializaci, celý objekt grafu je zapsán do trvalé paměti a čtení zpět v případě potřeby. Takže vždy, když čteme objekt z trvalé paměti, původní objekt je označován.

Využití mělké a hluboké kopie kopie:

Neexistuje žádná tvrdá a rychlá pravidla definovaná pro výběr mezi mělké kopírování a hluboké kopie, ale za normálních okolností bychom měli mít na paměti, že pokud má objekt pouze primitivní pole, pak samozřejmě bychom měli jít na mělké kopie, ale v případě, že objekt obsahuje odkazy na jiné objekty, pak vychází z požadavku, mělké kopie nebo hluboká kopie by mělo být provedeno. V případě, že odkazy nejsou aktualizovány pak není důvod zahájit hlubokou kopii.

Vysvětlete líné kopii:

Líný kopie může být definována jako kombinace obou mělké a hluboké kopie kopie. Mechanismus následuje jednoduchý přístup – v počátečním stavu, povrchní přístup je používáno kopírování. Počítadlo se také používá k mít přehled o tom, jak mnoho objektů sdílení dat. Když program chce změnit původní objekt, zkontroluje, zda objekt je sdílen či nikoliv. Je-li objekt sdílené, pak je zahájeno hluboké kopie mechanizmus.

Summary:

V mělké kopie, pouze pole primitivního datového typu jsou kopírovány, zatímco předměty reference se nekopírují. Hluboká kopie zahrnuje kopii primitivního datového typu, stejně jako objet odkazy. Neexistuje žádná tvrdá a rychlá pravidla ohledně toho, kdy k tomu mělkou kopii, a když k tomu hlubokou kopii. Lenivý kopie je kombinace obou těchto přístupů.

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