Deep Copy və ya Java dayaz Copy - Necə seçmək?

Deep_shallow_copy

Deep surəti və dayaz surəti

Baxış: Bu yazıda Java obyektlərin çıxarmaq prosesi müzakirə edəcək. çıxarmaq məqsədi müxtəlif tətbiqi tələb əsasında ola bilər. Amma mövcud çıxarmaq iki növ əsasən var, dərin və dayaz surəti. çıxarmaq üsulu bu iki yanaşma dəyişir.

Giriş:
Eyni data tipli başqa bir obyektin atributları çıxarmaq fəaliyyət obyekt surəti adlanır. Java, biz başqa çıxarmaq bir obyektin aşağıdakı yanaşmalar var

  • Dayaz Copy: kopyalanamaz etmək sahəsində bir ibtidai növü Burada əgər, kopyalanamaz etmək sahəsində bir yaddaş ünvanı, onda dəyəri başqa kopyalanır (və ya bir obyekt özü) sonra ünvan kopyalanır. Belə ki, ünvan bir obyekt ilə dəyişdirilə əgər, dəyişiklik hər yerdə əks olur.
  • Deep Copy: Burada data həm hallarda kopyalanır. Bu yanaşma costlier və yavaş.
  • Lazy Copy: Bu yuxarıda iki yanaşmanın bir birləşməsidir. Əvvəlcə dayaz surəti yanaşma istifadə və sonra data çox obyektlərin paylaşılan əgər yoxlanılır və proqram bir obyekt dəyişdirmək lazımdır ki,, dərin surəti yanaşma istifadə olunur.

Beləliklə, biz aşağıdakı iki şərtlər əsasında çıxarmaq növü seçə bilərsiniz

  • heç bir encapsulation tələb olunan zaman dayaz çıxarmaq istifadə.
  • encapsulation tələb olunan zaman dərin çıxarmaq istifadə.

Dayaz Copy:

dayaz surəti In, yeni obyekt orijinal obyekt dəyərlər dəqiq surəti olan yaradılmışdır. Dayaz surəti bit-müdrik surəti yanaşma aşağıdakı. dayaz surəti sahəsində bir yaddaş ünvan əgər, sonra ünvan kopyalanır. Belə ki, ünvan bir obyekt ilə dəyişdirilə əgər, dəyişiklik hər yerdə əks olur.

Shallow copy

Dayaz surəti

Figure 1: axını chart dayaz surəti təsvir

Bu rəqəm, obyekt – mainObj1 ibtidai növü field1 adlı bir sahə var deyirlər int, və növü String obyekti biz mainObj1 bir dayaz surəti nə zaman, mainObj2 field1 of sitemizi dəyəri lakin mainObj2 in String obyekti ehtiva növü int field2 ilə yaradılmışdır – hələ özünü objStr göstərir. field1 primitiv data type olduğundan, Bunun dəyəri field2 daxil kopyalanır. Lakin ildən objStr bir obyekt deyil, mainObj2 objStr eyni ünvana işarə edir. Belə ki, mainObj1 vasitəsilə objStr edilən hər hansı bir dəyişiklik mainObj2 öz əksini almaq.

İcra:

[kod]

Listing 1: Class SubjectVO.java subyektləri üçün dəyəri obyekt təsvir

package com.home.objectCopy;

ictimai sinif SubjectVO {

xüsusi String adı;

/**

* @return ad

*/

ictimai String getName() {

return ad;

}

/**

* @param ad

* adı təyin etmək

*/

ictimai ləğv setName(String adı) {

bu.name = adı;

}

ictimai SubjectVO(String adı) {

bu.name = adı;

}

}

[/kod]

Listing 2: Class PupilVO.java şagird üçün dəyəri obyekt təsvir

[kod]

package com.home.objectCopy;

ictimai sinif PupilVO həyata keçirir Cloneable {

// Contained obyekt

xüsusi SubjectVO subj;

xüsusi String adı;

/**

* @return the subj

*/

ictimai SubjectVO getSubj() {

return subj;

}

/**

* @param subj

* the subj təyin etmək

*/

ictimai ləğv setSubj(SubjectVO subj) {

bu.subj = subj;

}

/**

* @return ad

*/

ictimai String getName() {

return ad;

}

/**

* @param ad

* adı təyin etmək

*/

ictimai ləğv setName(String adı) {

bu.name = adı;

}

ictimai PupilVO(String adı, String sub) {

bu.name = adı;

bu.subj = yeni SubjectVO(sub);

}

ictimai Object klon() {

// dayaz surəti

çalışmaq {

return super.klon();

} tutmaq (CloneNotSupportedException e) {

return sıfır;

}

}

}

[/kod]

Listing3: Class ShallowCopyTest.java izah surəti prosesi

[kod]
package com.home.objectCopy;

ictimai sinif ShallowCopyTest {

ictimai statik ləğv əsas(Sim[] args) {

// Original Object

PupilVO damazlıq = yeni PupilVO(“Johnathan”, “cəbr”);

Sistem.həyata.println(“Original Object: ” + stud.getName() + ” – ”

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

// Clone Object

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

Sistem.həyata.println(“cloned Object: ” + clonedStud.getName() + ” – ”

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

stud.setName(“Daniel”);

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

Sistem.həyata.println(“Bu yenilənir sonra Original Object: ”

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

Sistem.həyata.println(“orijinal obyekt güncelledikten sonra Cloned Object: ”

+ clonedStud.getName() + ” – ”

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

}

}

[/kod]

buraxılış: Bu proqram çıxış altında kimi

Original Object: Johnathan – cəbr

cloned Object: Johnathan – cəbr

Bu yenilənir sonra Original Object: Daniel – fizika

orijinal obyekt güncelledikten sonra Cloned Object: Johnathan – fizika

Burada sahə adı dəyəri surəti əməliyyatdan sonra dəyişdi olur ki, görmək, lakin eyni yaddaş ünvana işarə kimi obyekt mövzu dəyəri eyni olaraq qalır. Beləliklə Yonatan üçün mövzu "Fizika olur’ harada "Cəbr olmalıdır’ cloned obyekt SubjectVO üçün obyekt dəyişməz olaraq qalır.

Deep Copy:

Dərin surəti In, bir obyekt yalnız bütün sahələrdə kopyalanır, ki, obyekt ilə qeyd bütün dinamik ayrılmış yaddaş ünvan də kopyalanır.

Deep Cpoy

Deep Copy

Figure 2: diaqram dərin surəti prosesi təsvir

Bu rəqəm, obyekt mainObj1 ibtidai data type int demək field1 sahələri var, və növü String obyekti biz mainObj1 dərin surəti nə zaman, mainObj2 Belə mainObj1 ilə objStr1 edilən hər hansı bir dəyişiklik mainObj2 əks deyil objStr1 of kopyalanan dəyəri olan field2 field1 of sitemizi dəyəri olan və objStr2 yaradılmışdır ilə yaradılmışdır.

İcra:

Listing4: Class dərin surəti izah

[Code]

package com.home.DeepCopy;

ictimai sinif PupilVO həyata keçirir Cloneable {

// Contained obyekt

xüsusi SubjectVO subj;

xüsusi String adı;

/**

* @return the subj

*/

ictimai SubjectVO getSubj() {

return subj;

}

/**

* @param subj

* the subj təyin etmək

*/

ictimai ləğv setSubj(SubjectVO subj) {

bu.subj = subj;

}

/**

* @return ad

*/

ictimai String getName() {

return ad;

}

/**

* @param ad

* adı təyin etmək

*/

ictimai ləğv setName(String adı) {

bu.name = adı;

}

ictimai PupilVO(String adı, String sub) {

bu.name = adı;

bu.subj = yeni SubjectVO(sub);

}

ictimai Object klon() {

// dərin surəti

PupilVO şagirdi = yeni PupilVO(ad, subj.getName());

return şagird;

}

}

[/kod]

Bu yanaşma və əvvəllər yanaşma arasında yeganə fərq PupilVO olan klon metodu yeni yaradılmış PupilVO obyekt qaytarır ki,. Bu surəti mexanizm başladılan zaman təmin, object SubjectVO də dəyişdi olur. Deep surəti alternativ yanaşma var – serialization. serialization In, bütün obyekt graph davamlı mağaza yazılı və lazım geri oxumaq. Beləliklə, biz davamlı mağaza obyekt oxumaq zaman, orijinal obyekt adlanır.

dayaz surəti və dərin surəti istifadə:

dayaz surəti və dərin surəti lakin adətən biz yadda saxlamaq lazımdır arasında seçilməsi üçün müəyyən heç bir ağır və sürətli qayda var ki, obyekt yalnız ibtidai sahələri var, sonra təbii ki, biz dayaz surəti getmək lazımdır, lakin obyekt digər obyektlərin istinadlar var, sonra əsaslanır, dayaz surəti və ya dərin surəti edilməli. istinadlar yenilənir deyil, onda dərin surəti başlamaq üçün heç bir məqam yoxdur.

tənbəl surəti izah:

A tənbəl surəti dayaz surəti və dərin surəti həm də birləşməsi kimi müəyyən edilə bilər. mexanizm sadə yanaşma aşağıdakı – ilkin dövlət, dayaz surəti yanaşma istifadə olunur. A counter bir çox obyektlərin data bölüşmək necə bir takip üçün istifadə olunur. proqram orijinal obyekt dəyişdirmək istəyir zaman, Bu obyekt paylaşılan və ya olub-olmadığını yoxlayır. object paylaşılan Əgər, sonra dərin surəti mexanizmi təşəbbüsü.

Summary:

dayaz surəti In, obyektlərin istinadlar sitemizi deyil isə ibtidai data növü yalnız sahələri kopyalanır. Deep surəti ibtidai data növü surətini, habelə Objet istinadlar daxildir. dərin surəti etmək dayaz surəti nə zaman və zaman heç bir ağır və sürətli qayda var. Lazy surəti bu yanaşmaların hər ikisi var.

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