Còpia profunda o còpia superficial en Java - Com triar?

Deep_shallow_copy

còpia en profunditat i còpia superficial

Visió de conjunt: En aquest article anem a discutir el procés de copiar objectes en java. El propòsit de la còpia es pot basar diferent en el requisit d'aplicació. No obstant això, hi ha principalment dos tipus de còpia disponibles, còpia profunda i superficial. El mètode de còpia varia en aquests dos enfocaments.

Introducció:
L'acció de copiar els atributs d'un objecte en un altre tipus de dades de la mateixa s'anomena còpia d'un objecte. En java, tenim els següents enfocaments de la còpia un objecte en un altre

  • còpia superficial: Aquí, si el camp que es va a copiar és un tipus primitiu, llavors el valor es copia més si el camp que es va a copiar és una adreça de memòria (o un objecte en si mateix) a continuació, la direcció es copia. Així, si la direcció es canvia per un objecte, el canvi es reflecteix a tot arreu.
  • còpia profunda: Aquí les dades es copien en les dues situacions. Aquest enfocament és més costós i més lent.
  • Lazy Còpia: Aquesta és una combinació dels dos enfocaments anteriors. Inicialment, l'enfocament de còpia superficial s'utilitza i després es comprova si les dades és compartida per molts objectes i el programa ha de modificar un objecte, S'utilitza l'enfocament de còpia profunda.

Així podem seleccionar el tipus de còpia en base a les següents dues condicions

  • Utilitzeu còpia superficial quan no es requereix la encapsulació.
  • Utilitzeu una còpia completa quan es requereix l'encapsulació.

còpia superficial:

En còpia superficial, un nou objecte es cregui que conté la còpia exacta dels valors en l'objecte original. còpia superficial segueix l'enfocament de còpia bit a bit. En còpia superficial si el camp és una adreça de memòria, a continuació, la direcció es copia. Així, si la direcció es canvia per un objecte, el canvi es reflecteix a tot arreu.

Shallow copy

còpia superficial

Figure 1: El diagrama de flux descriu còpia superficial

En aquesta figura, l'objecte – mainObj1 té un camp denominat com camp1 d'un tipus primitiu dir int, i un objecte de tipus String Quan fem una còpia superficial de l'mainObj1, mainObj2 es crea amb camp2 de tipus int que conté el valor copiat de camp1 però l'objecte String en mainObj2 – Encara apunta a si objStr. Des camp1 és un tipus de dades primitiu, el valor de la mateixa es copia en camp2. Però ja que és un objecte objStr, mainObj2 està apuntant a la mateixa adreça de objStr. Així que qualsevol canvi realitzat a través de objStr mainObj1 es reflecteixen en mainObj2.

implementació:

[codi]

Listing 1: Classe SubjectVO.java descriu objecte de valor per als subjectes

package com.home.objectCopy;

públic classe SubjectVO {

privat nom de la cadena;

/**

* @return el nom

*/

públic cadena getNombre() {

return nom;

}

/**

* @param nom

* el nom per establir

*/

públic anul · lar setName(nom de la cadena) {

aquest.name = nom;

}

públic SubjectVO(nom de la cadena) {

aquest.name = nom;

}

}

[/codi]

Listing 2: Classe PupilVO.java descriure objecte de valor de la pupil·la

[codi]

package com.home.objectCopy;

públic classe PupilVO implements Cloneable {

// objecte contingut

privat SubjectVO suj;

privat nom de la cadena;

/**

* @return the suj

*/

públic SubjectVO getSubj() {

return suj;

}

/**

* @param suj

* the suj establir

*/

públic anul · lar setSubj(SubjectVO suj) {

aquest.Subj suj =;

}

/**

* @return el nom

*/

públic cadena getNombre() {

return nom;

}

/**

* @param nom

* el nom per establir

*/

públic anul · lar setName(nom de la cadena) {

aquest.name = nom;

}

públic PupilVO(nom de la cadena, sub string) {

aquest.name = nom;

aquest.suj = nou SubjectVO(sub);

}

públic clon d'objectes() {

// còpia superficial

tractar de {

return súper.clon();

} agafar (CloneNotSupportedException correu) {

return zero;

}

}

}

[/codi]

Listing3: Classe ShallowCopyTest.java descrivint procés de còpia

[codi]
package com.home.objectCopy;

públic classe ShallowCopyTest {

públic estàtic anul · lar principal(Cadena[] args) {

// objecte original

PupilVO espàrrec = nou PupilVO(“Johnathan”, “àlgebra”);

Sistema.fora.println(“objecte original: ” + stud.getName() + ” – ”

+ stud.getSubj().getNombre());

// objecte clon

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

Sistema.fora.println(“objecte clonat: ” + clonedStud.getName() + ” – ”

+ clonedStud.getSubj().getNombre());

stud.setName(“Daniel”);

stud.getSubj().setName(“física”);

Sistema.fora.println(“Objecte original després que s'actualitza: ”

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

Sistema.fora.println(“Objecte clonat després d'actualitzar objecte original: ”

+ clonedStud.getName() + ” – ”

+ clonedStud.getSubj().getNombre());

}

}

[/codi]

sortida: La sortida d'aquest programa és tan baix

objecte original: Johnathan – àlgebra

objecte clonat: Johnathan – àlgebra

Objecte original després que s'actualitza: Daniel – física

Objecte clonat després d'actualitzar objecte original: Johnathan – física

Aquí veiem que el valor del nom del camp es canvia després de l'operació de còpia, però el valor de l'objecte subjecte segueix sent el mateix, ja que està apuntant a la mateixa adreça de memòria. Per tant el tema de Jonathan es converteix en 'Física’ on com ha de ser 'Àlgebra’ com l'objecte de SubjectVO en l'objecte clonat es manté sense canvis.

còpia profunda:

En còpia profunda, no només tots els camps d'un objecte es copien, tota la direcció de memòria assignada dinàmicament que es va assenyalar per aquest objecte també es copia.

Deep Cpoy

còpia profunda

Figure 2: El diagrama descriu el procés de còpia profunda

En aquesta figura, l'objecte mainObj1 té camps camp1 un tipus de dades primitiu diuen int, i un objecte de tipus String Quan fem una còpia profunda de mainObj1, mainObj2 es crea amb camp2 conté el valor copiat de camp1 i es crea objStr2 que conté el valor copiat de objStr1 Així que qualsevol canvi realitzat en objStr1 en mainObj1 no reflectiran en mainObj2.

implementació:

Listing4: Classe descriure còpia profunda

[Code]

package com.home.DeepCopy;

públic classe PupilVO implements Cloneable {

// objecte contingut

privat SubjectVO suj;

privat nom de la cadena;

/**

* @return the suj

*/

públic SubjectVO getSubj() {

return suj;

}

/**

* @param suj

* the suj establir

*/

públic anul · lar setSubj(SubjectVO suj) {

aquest.Subj suj =;

}

/**

* @return el nom

*/

públic cadena getNombre() {

return nom;

}

/**

* @param nom

* el nom per establir

*/

públic anul · lar setName(nom de la cadena) {

aquest.name = nom;

}

públic PupilVO(nom de la cadena, sub string) {

aquest.name = nom;

aquest.suj = nou SubjectVO(sub);

}

públic clon d'objectes() {

// còpia en profunditat

PupilVO pupil·la = nou PupilVO(nom, subj.getName());

return pupil·la;

}

}

[/codi]

L'única diferència entre aquest enfocament i l'enfocament anterior és que el mètode clone al PupilVO retorna un objecte creat PupilVO. Això assegura que cada vegada que el mecanisme de còpia en iniciar, SubjectVO l'objecte també es canvia. còpia en profunditat té un enfocament alternatiu – serialització. a la serialització, tot el gràfic d'objectes està escrit en un magatzem persistent i torna a llegir quan sigui necessari. Així que cada vegada que llegim l'objecte del magatzem persistent, l'objecte original es coneix.

L'ús de còpia superficial i còpia en profunditat:

No hi ha una regla fixa definida per seleccionar entre còpia superficial i còpia en profunditat però normalment cal tenir en compte que si un objecte té camps només primitius, llavors, evidentment, cal anar a per còpia superficial, però si l'objecte té referències a altres objectes, a continuació, basat en el requisit, còpia superficial o còpia profunda s'ha de fer. Si les referències no s'actualitzen llavors no hi ha punt per iniciar una còpia en profunditat.

Explicar còpia mandrosa:

Una còpia mandrós pot ser definida com una combinació de tots dos còpia superficial i còpia profunda. El mecanisme segueix un enfocament senzill – en l'estat inicial, s'utilitza enfocament còpia superficial. Un comptador també s'utilitza per mantenir un seguiment de quants objectes comparteixen les dades. Quan el programa es vol modificar l'objecte original, comprova si l'objecte és compartida o no. Si l'objecte és compartida, a continuació, s'inicia el mecanisme de còpia en profunditat.

Summary:

En còpia superficial, únics camps de tipus de dades primitiu es copien mentre que les referències d'objectes no es copien. còpia en profunditat implica la còpia de tipus de dades primitiu, així com referències a objec. No hi ha cap regla dura i ràpida pel que fa a quan fer còpia superficial i quan cal fer una còpia profunda. còpia Lazy és una combinació de tots dos enfocaments.

Etiquetatge en:
============================================= ============================================== Buy best TechAlpine Books on Amazon
============================================== ---------------------------------------------------------------- electrician ct chestnutelectric
error

Enjoy this blog? Please spread the word :)

Follow by Email
LinkedIn
LinkedIn
Share