Deep Copy կամ մակերեսային պատճեն է Java - Ինչպես ընտրել?

Deep_shallow_copy

Խորը պատճենը եւ մակերեսային պատճենը

Overview: Այս հոդվածում մենք կքննարկենք գործընթացը պատճենահանման օբյեկտների Java. Նպատակն պատճենահանման կարող են տարբեր լինել դիմումի հիման վրա պահանջի. Բայց կան հիմնականում երկու տեսակի արտագրելու, խորը եւ մակերեսային պատճենը. Եղանակը պատճենահանման տատանվում այդ երկու մոտեցումների.

Ներածություն:
Ակցիան պատճենահանման հատկանիշները մեկ օբյեկտի մեջ մեկ այլ նույն տվյալների տեսակը կոչվում օբյեկտ պատճենը. Այս Java, մենք ունենք հետեւյալ մոտեցումները պատճենահանման մեկ օբյեկտի մեջ մյուսը

  • մակերեսային Copy: Այստեղ Եթե դաշտը, որը պետք է պատճենահանվել է պարզունակ տեսակը, ապա արժեքը պատճենահանվել էլ, եթե դաշտը, որը պետք է պատճենահանվել է հիշողության հասցեն (կամ օբյեկտ ինքնին) ապա հասցեն պատճենահանվել. Այսպիսով, եթե այդ հասցեն փոխվել է մեկ օբյեկտի, որ փոփոխությունը ստանում արտացոլված ամենուր.
  • Deep Copy: Այստեղ տվյալների պատճենահանվել է երկու իրավիճակներում. Այս մոտեցումը costlier եւ դանդաղ.
  • Lazy Copy: Սա մի համադրություն վերը նշված երկու մոտեցումների. Սկզբում մակերեսային պատճենը մոտեցումը կիրառվում, իսկ հետո ստուգվում է, եթե այդ տվյալները կիսում են բազմաթիվ առարկաների եւ ծրագիրը պետք է փոփոխել օբյեկտ, խոր պատճենը մոտեցումը կիրառվում.

Այնպես որ, մենք կարող ենք ընտրել տեսակը պատճենահանման հիման վրա հետեւյալ երկու պայմանների

  • Օգտագործեք մակերեսային պատճենահանում, երբ ոչ encapsulation պարտադիր է.
  • Օգտագործեք խոր պատճենահանման, երբ encapsulation պարտադիր է.

մակերեսային Copy:

Մանրացած պատճենը, նոր օբյեկտ ստեղծվել, որը պարունակում է ճշգրիտ պատճենը արժեքների օրիգինալ օբյեկտ. Մակերեսային պատճենը հետեւում է քիչ իմաստուն պատճենը մոտեցում. Մանրացած պատճենը, եթե դաշտը հիշողության հասցեն, ապա հասցեն պատճենահանվել. Այսպիսով, եթե այդ հասցեն փոխվել է մեկ օբյեկտի, որ փոփոխությունը ստանում արտացոլված ամենուր.

Shallow copy

մակերեսային պատճենը

Figure 1: Հոսքը աղյուսակը նկարագրում մակերեսային պատճենը

Այս գործչի, օբյեկտ – mainObj1 ունի մի դաշտ անունով, քանի որ field1 է պարզունակ տեսակի ասում int, եւ օբյեկտ տիպի String Երբ մենք անում ենք մի մակերեսային պատճենը mainObj1, mainObj2 ստեղծվել field2 int տիպի, որը պարունակում է պատճենահանված արժեքը field1 այլ տողը օբյեկտը mainObj2 – դեռ նշում է objStr իրեն. Քանի որ field1 պարզունակ տվյալների տեսակը, արժեքը դրա պատճենահանվել մեջ field2. Բայց քանի որ objStr օբյեկտ, mainObj2 մատնացույց է նույն հասցեով, objStr. Այնպես որ, ցանկացած փոփոխությունների objStr միջոցով mainObj1 ստանալ արտացոլված է mainObj2.

իրականացում:

[համար]

Listing 1: Մանրամասն SubjectVO.java նկարագրում արժեք օբյեկտ առարկաների

package com.home.objectCopy;

հասարակություն դաս SubjectVO {

մասնավոր String անունը;

/**

* @return անունը,

*/

հասարակություն String getName() {

return անվանում;

}

/**

* @param անվանում

* անունը, սահմանել

*/

հասարակություն անվավեր setName(String անունը) {

այս.name = անունը;

}

հասարակություն SubjectVO(String անունը) {

այս.name = անունը;

}

}

[/համար]

Listing 2: Մանրամասն PupilVO.java նկարագրելով արժեքը օբյեկտ է աշակերտի

[համար]

package com.home.objectCopy;

հասարակություն դաս PupilVO գործիքներ Cloneable {

// պարունակվում օբյեկտ

մասնավոր SubjectVO Վերնագ;

մասնավոր String անունը;

/**

* @return the Վերնագ

*/

հասարակություն SubjectVO getSubj() {

return Վերնագ;

}

/**

* @param Վերնագ

* the Վերնագ սահմանել

*/

հասարակություն անվավեր setSubj(SubjectVO Վերնագ) {

այս.Վերնագ = Վերնագ;

}

/**

* @return անունը,

*/

հասարակություն String getName() {

return անվանում;

}

/**

* @param անվանում

* անունը, սահմանել

*/

հասարակություն անվավեր setName(String անունը) {

այս.name = անունը;

}

հասարակություն PupilVO(String անունը, String ենթակետի) {

այս.name = անունը;

այս.Վերնագ = նոր SubjectVO(ենթակետի);

}

հասարակություն Օբյեկտ clone() {

// մակերեսային պատճենը

փորձել {

return սուպեր.clone();

} բռնելը (CloneNotSupportedException ե) {

return զրո;

}

}

}

[/համար]

Listing3: Մանրամասն ShallowCopyTest.java նկարագրելով պատճենը գործընթացը

[համար]
package com.home.objectCopy;

հասարակություն դաս ShallowCopyTest {

հասարակություն ստատիկ անվավեր հիմնական(Լար[] args) {

// Original օբյեկտը

PupilVO stud = նոր PupilVO(“Johnathan”, “հանրահաշիվ”);

Համակարգ.դուրս.println(“Original օբյեկտը: ” + stud.getName() + ” – ”

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

// clone օբյեկտը

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

Համակարգ.դուրս.println(“կլոնավորել օբյեկտը: ” + clonedStud.getName() + ” – ”

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

stud.setName(“Daniel”);

stud.getSubj().setName(“ֆիզիկա”);

Համակարգ.դուրս.println(“Original օբյեկտը հետո թարմացվել է: ”

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

Համակարգ.դուրս.println(“Կլոնավորել օբյեկտը թարմացումից հետո օրիգինալ օբյեկտ: ”

+ clonedStud.getName() + ” – ”

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

}

}

[/համար]

արտադրանք: Ի արտադրանքը Այս ծրագրի ներքո

Original օբյեկտը: Johnathan – հանրահաշիվ

կլոնավորել օբյեկտը: Johnathan – հանրահաշիվ

Original օբյեկտը հետո թարմացվել է: Daniel – ֆիզիկա

Կլոնավորել օբյեկտը թարմացումից հետո օրիգինալ օբյեկտ: Johnathan – ֆիզիկա

Այստեղ մենք տեսնում ենք, որ այդ արժեքը դաշտի անվան ստանում հետո փոխվել պատճենը ստարտի, սակայն արժեքը օբյեկտի առարկայի մնում է նույնը, քանի որ այն մատնացույց անելով նույն հիշողության հասցեն. Հետեւաբար առարկա Հովնաթանի դառնում 'Ֆիզիկա’ որտեղ, քանի որ այն պետք է լինի », հանրահաշիվ’ քանի որ օբյեկտ SubjectVO է cloned օբյեկտի մնում է անփոփոխ.

Deep Copy:

Խորը պատճենը, ոչ միայն բոլոր դաշտերը առարկայի են պատճենահանվել, բոլոր դինամիկ հատկացրել հիշողությունը հասցեն, որը մատնացույց է այդ օբյեկտի նաեւ պատճենահանվել.

Deep Cpoy

Deep Copy

Figure 2: The դիագրամ նկարագրում խորը պատճենը գործընթացը

Այս գործչի, օբյեկտ mainObj1 ունի ոլորտներում field1 պարզունակ տվյալների տեսակը ասում են int, եւ օբյեկտ տիպի String Երբ մենք անում ենք մի խորը պատճենը mainObj1, mainObj2 ստեղծված field2 պարունակող պատճենահանված արժեքը field1 եւ objStr2 ստեղծված, որը պարունակում է պատճենահանված արժեքը objStr1 Այնպես որ, ցանկացած փոփոխությունների objStr1 է mainObj1 չի արտացոլում է mainObj2.

իրականացում:

Listing4: Մանրամասն նկարագրելով խորը պատճենը

[Code]

package com.home.DeepCopy;

հասարակություն դաս PupilVO գործիքներ Cloneable {

// պարունակվում օբյեկտ

մասնավոր SubjectVO Վերնագ;

մասնավոր String անունը;

/**

* @return the Վերնագ

*/

հասարակություն SubjectVO getSubj() {

return Վերնագ;

}

/**

* @param Վերնագ

* the Վերնագ սահմանել

*/

հասարակություն անվավեր setSubj(SubjectVO Վերնագ) {

այս.Վերնագ = Վերնագ;

}

/**

* @return անունը,

*/

հասարակություն String getName() {

return անվանում;

}

/**

* @param անվանում

* անունը, սահմանել

*/

հասարակություն անվավեր setName(String անունը) {

այս.name = անունը;

}

հասարակություն PupilVO(String անունը, String ենթակետի) {

այս.name = անունը;

այս.Վերնագ = նոր SubjectVO(ենթակետի);

}

հասարակություն Օբյեկտ clone() {

// խորը պատճենը

PupilVO աշակերտ = նոր PupilVO(անվանում, subj.getName());

return աշակերտ;

}

}

[/համար]

Միակ տարբերությունն այս մոտեցման եւ վաղ մոտեցման այն է, որ clone մեթոդը է PupilVO վերադարձնում է նորաստեղծ PupilVO օբյեկտ. Սա ապահովում է, որ ամեն անգամ, երբ պատճենը մեխանիզմը նախաձեռնել, օբյեկտ SubjectVO նաեւ փոխվում. Deep պատճենը ունի այլընտրանքային մոտեցում – serialization. ի serialization, ամբողջ օբյեկտ գրաֆիկի գրված է մի համառ խանութ եւ կարդալ, երբ պահանջվում է. Այնպես որ, երբ մենք կարդում ենք օբյեկտը ից համառ խանութ, օրիգինալ օբյեկտ կոչվում.

Կիրառումը մանրացած օրինակի եւ խոր պատճենը:

Չկա ոչ մի դժվար է եւ արագ կանոն սահմանվում է ընտրության միջեւ մանրացած օրինակի եւ խոր պատճենը սակայն սովորաբար մենք պետք է հաշվի առնել, որ եթե օբյեկտ ունի ընդամենը պարզունակ ոլորտներում, ապա ակնհայտորեն մենք պետք է գնալ մանրացած պատճենը, բայց եթե օբյեկտը ունի հղումներ դեպի այլ օբյեկտների, ապա հիման վրա պահանջի, մակերեսային պատճենը կամ խորը պատճենը պետք է արվի. Եթե ​​հղումները չեն թարմացվում, ապա իմաստ չունի նախաձեռնելու խորը պատճենը.

Բացատրիր, ծույլ պատճենը:

A ծույլ պատճենը կարող է սահմանվել որպես համադրություն, այնպես էլ մանրացած օրինակի ու խոր պատճենը. Մեխանիզմը հետեւյալն է մի պարզ մոտեցում – է նախնական վիճակում, մակերեսային պատճենը մոտեցումը կիրառվում. A Counter է նաեւ օգտագործվում է պահել հետեւել, թե ինչպես շատ օբյեկտներ կիսել տվյալները. Երբ ծրագիրը ցանկանում է փոփոխել բնօրինակը օբյեկտը, դա ստուգում, թե արդյոք օբյեկտը կիսում է, թե ոչ. Եթե ​​օբյեկտն կիսում, ապա խոր պատճենը մեխանիզմը նախաձեռնել.

Summary:

Մանրացած պատճենը, միայն ոլորտները պարզունակ տվյալների տեսակի պատճենահանվել իսկ օբյեկտների հղումները չեն պատճենահանված. Deep պատճենը ներառում է պատճենը պարզունակ տիպով, ինչպես նաեւ Objet հղումները. Չկա ոչ մի դժվար է եւ արագ կանոն, թե երբ է դա անել մակերեսային պատճենը եւ երբ է անել մի խորը պատճենը. Lazy պատճենը մի համադրություն, այնպես էլ այդ մոտեցումների.

Tagged on:
============================================= ============================================== Գնեք լավագույն տեխնոլոգիական գրքերը Amazon- ում,en,Էլեկտրականություն CT շագանակագույն էլեկտրաէներգիա,en
============================================== ---------------------------------------------------------------- electrician ct chestnutelectric
error

Enjoy this blog? Please spread the word :)

Follow by Email
LinkedIn
LinkedIn
Share