Welcome to Our Website

Lavvandede vs. Dyb Kopi i Java

I denne artikel fra min gratis Java 8 Kursus, jeg vil diskutere forskellen mellem en Dyb og en Overfladisk Kopi. Du kan do .nloade slides og artiklen som PDF her.

Hvad er en kopi?

til at begynde med vil jeg gerne fremhæve, hvad en kopi i Java er. Lad os først skelne mellem en referencekopi og en objektkopi. En referencekopi, som navnet antyder, opretter en kopi af en referencevariabel, der peger på et objekt., Hvis vi har et Bilobjekt, med en myCar-variabel, der peger på det, og vi laver en referencekopi, vil vi nu have to myCar-variabler, men stadig et objekt.

Eksempel 1:

Et objekt kopi laver en kopi af objektet selv. Så hvis vi igen kopierede vores bilobjekt, ville vi oprette en kopi af selve objektet samt en anden referencevariabel, der henviser til det kopierede objekt.

Eksempel 2:

Hvad Er en Genstand?,

både en dyb kopi og en lav kopi er typer af objektkopier, men hvad er der virkelig et objekt? Ofte, når vi taler om et objekt, taler vi om det som en enkelt enhed, der ikke kan nedbrydes yderligere, som en ydmyg kaffebønne. Det er dog forenklet.

eksempel 3

sig, at vi har et personobjekt. Vores personobjekt er faktisk sammensat af andre objekter, som du kan se i Eksempel 4. Vores Person indeholder et Navneobjekt og et Adresseobjekt., Navnet på tur, indeholder et fornavn og et efternavn objekt; Adresseobjektet består af et Gadeobjekt og et Byobjekt. Så når jeg taler om Person i denne artikel, taler jeg faktisk om hele dette netværk af objekter.

eksempel 4

så hvorfor vil vi gerne kopiere denne personobjekt? En objektkopi, normalt kaldet en klon, oprettes, hvis vi vil ændre eller flytte et objekt, mens vi stadig bevarer det originale objekt. Der er mange forskellige måder at kopiere et objekt på, som du kan lære om i en anden artikel., I denne artikel bruger vi specifikt en kopikonstruktør til at oprette vores kopier.

lav kopi

lad os først tale om den lave kopi. En overfladisk kopi af et objekt kopierer ‘hovedobjektet’, men kopierer ikke de indre objekter. De ‘indre objekter’ deles mellem det originale objekt og dets kopi. For eksempel i vores personobjekt ville vi oprette en anden Person, men begge objekter ville dele samme navn og Adresseobjekter.

lad os se på et kodningseksempel. I eksempel 5 har vi vores klasseperson, som indeholder et navn og Adresseobjekt., Kopien konstruktør tager originalPerson objekt og kopierer dens reference variabler.

eksempel 5

problemet med den lave kopi er, at de to objekter ikke er uafhængige. Hvis du ændrer Navneobjektet for en Person, vil ændringen blive afspejlet i den anden persons objekt.

lad os anvende dette på et eksempel. Sig, at vi har et Personobjekt med en referencevariabel mor; derefter laver vi en kopi af mor og skaber et andet Personobjekt, søn. Hvis sønnen senere i koden forsøger at flytte ud () ved at ændre sit Adresseobjekt, flytter moderen med ham!,

Person mother = new Person(new Name(…), new Address(…));Person son = new Person(mother);son.moveOut(new Street(…), new City(…));

Eksempel 6

Det sker, fordi vores mor og søn objekter deler den samme Adresse objekt, som du kan se illustreret i Eksempel 7. Når vi ændrer adressen i et objekt, ændres det i begge!

Eksempel 7

Dyb Kopi

i Modsætning til overfladisk kopi, en dyb kopi af en fuldt ud uafhængig kopi af et objekt. Hvis vi kopierede vores personobjekt, ville vi kopiere hele objektstrukturen.,

Eksempel 8

En ændring i den Adresse, der er genstand for en Person, der ikke ville blive afspejlet i et andet objekt, som du kan se af diagrammet i Eksempel 8. Hvis vi kigger på koden i eksempel 9, kan du se, at vi ikke kun bruger en kopikonstruktør på vores Personobjekt, men vi bruger også kopikonstruktører på de indre objekter.

eksempel 9

Ved hjælp af denne dybe kopi kan vi prøve Mor-søn-eksemplet igen fra Eksempel 6. Nu er sønnen i stand til at flytte ud!,

det er dog ikke slutningen på historien. For at skabe en ægte dyb kopi skal vi fortsætte med at kopiere alle Personobjektets indlejrede elementer, indtil der kun er primitive typer og “uforanderlige” tilbage. Lad os se på Gaden klasse for bedre at illustrere dette:

Eksempel 10

Gaden objekt er sammensat af to instansvariabler – String navn og int antal. int nummer er en primitiv værdi og ikke et objekt. Det er bare en simpel værdi, der ikke kan deles, så ved at oprette en anden instansvariabel opretter vi automatisk en uafhængig kopi., String er en uforanderlig. Kort sagt, en uforanderlig er et objekt, der, når den først er oprettet, aldrig kan ændres igen. Derfor kan du dele det uden at skulle oprette en dyb kopi af det.

konklusion

Afslutningsvis vil jeg gerne tale om nogle kodningsteknikker, vi brugte i vores Mor-søn-eksempel. Bare fordi en dyb kopi vil lade dig ændre de interne detaljer i et objekt, såsom Adresseobjektet, betyder det ikke, at du skal., Dette ville reducere kodekvaliteten, da det ville gøre Personklassen mere skrøbelig over for ændringer-når Adresseklassen ændres, skal du (potentielt) også anvende ændringer på Personklassen. For eksempel, hvis Adresseklassen ikke længere indeholder et Gadeobjekt, er vi nødt til at ændre moveout () – metoden i Personklassen oven på de ændringer, vi allerede har foretaget i Adresseklassen.i Eksempel 6 i denne artikel valgte jeg kun at bruge et nyt gade-og Byobjekt for bedre at illustrere forskellen mellem en lav og en dyb kopi., I stedet, vil jeg anbefale, at du tildeler en ny Adresse objekt i stedet, effektivt konvertere til en hybrid af en overfladisk og en dyb kopi, som du kan se i Eksempel 10:

Person mother = new Person(new Name(…), new Address(…));Person son = new Person(mother);son.moveOut(new Address(...));

Eksempel 11

I objekt-orienteret udtryk, det er i strid med indkapsling, og bør derfor undgås. Indkapsling er et af de vigtigste aspekter af objektorienteret programmering. I dette tilfælde havde jeg overtrådt indkapsling ved at få adgang til de interne detaljer om Adresseobjektet i vores Personklasse., Dette skader vores kode, fordi vi nu har sammenfiltret Personklassen i Adresseklassen, og hvis vi foretager ændringer i Adresseklassen ned ad linjen, det kan skade Personklassen, som jeg forklarede ovenfor. Mens du selvfølgelig skal forbinde dine forskellige klasser for at få et kodningsprojekt, skal du analysere omkostninger og fordele, når du forbinder to klasser.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *