Welcome to Our Website

Grunne vs. Dyp Kopi i Java

I denne artikkelen fra min gratis Java-8 Kurs, jeg vil være med å diskutere forskjellen mellom Dypt og Grunt Kopi. Du kan laste ned den lysbilder og artikkelen som PDF her.

Hva Er en Kopi?

for Å begynne, jeg ønsker å synliggjøre hva en kopi i Java er. Først, la oss skille mellom en referanse kopi og kopiere et objekt. En referanse kopier, som navnet tilsier, skaper en kopi av en referanse variabel som peker til et objekt., Hvis vi har en Bil objekt, med en myCar variabel som peker til det, og vi gjør en referanse kopi, vil vi nå har to myCar variabler, men fortsatt ett objekt.

Eksempel 1

Et objekt kopier-lager en kopi av selve objektet. Så hvis vi igjen kopiert vår bil objekt, ville vi lage en kopi av objektet selv, så vel som en annen referanse variabelen refererer til det kopierte objektet.

Eksempel 2

Hva Er et Objekt?,

Både en Dyp Kopi og et Grunt Kopi typer objekt kopier, men hva som egentlig er et objekt? Ofte, når vi snakker om et objekt, vi snakker om den som en enkelt enhet som ikke kan brytes ned videre, som en ydmyk coffee bean. Men, det er oversimplified.

Eksempel 3

Si at vi har et Person objekt. Våre Person-objekt er faktisk består av andre objekter, som du kan se i Eksempel 4. Vår Person inneholder Navn objekt og en Adresse objekt., Navnet i sin tur inneholder et Fornavn og et Etternavn objekt; den Adressen som objektet består av en Gate objekt og en By som objekt. Så når jeg snakker om Person i denne artikkelen, jeg er egentlig snakker om dette hele nettverket av objekter.

Eksempel 4

Så hvorfor skulle vi ønsker å kopiere denne Personen objekt? Et objekt kopiere, vanligvis kalt en klone, er laget hvis vi ønsker å endre eller flytte et objekt, mens du fremdeles beholder det opprinnelige objektet. Det er mange forskjellige måter å kopiere et objekt som du kan lære mer om i en annen artikkel., I denne artikkelen vil vi spesielt være å bruke en kopi konstruktør å lage vår kopier.

Grunne Kopi

Først la oss snakke om den grunne kopi. En grunn kopi av et objekt kopier ‘main’ objekt, men ikke kopier den indre objekter. Den «indre objekter’ er delt mellom den opprinnelige objektet og sin kopi. For eksempel, i våre Person-objekt, for vi ville lage en annen Person, men begge objektene har samme Navn og Adresse objekter.

La oss se på et koding eksempel. I Eksempel 5, har vi vår klasse Person, som inneholder Navn og Adresse objekt., Kopier konstruktøren tar originalPerson objekt og kopier sin referanse variabler.

Eksempel 5

problemet med grunt kopi er at to objekter er ikke uavhengige. Hvis du vil endre Navn gjenstand for en Person, vil endringen reflekteres i den andre Person-objekt.

La oss bruke denne til et eksempel. Si at vi har en Person-objekt med en referanse variabel mor, så gjør vi en kopi av mor, og skaper en andre Person-objekt, sønn. Hvis senere i koden, sønn prøver å moveOut() ved å endre sin Adresse objekt, moren flytter med ham!,

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

Eksempel 6

Dette skjer fordi vår mor og sønn objekter dele samme Adresse objekt, som du kan se illustrert i Eksempel 7. Når vi endrer Adresse i ett objekt, er det endringer i begge!

Eksempel 7

Dyp Kopi

i Motsetning til grunn kopi, en dyp kopi er en helt uavhengig kopi av et objekt. Hvis vi kopiert våre Person-objekt, for vi ville kopiere hele objekt struktur.,

Eksempel 8

En endring i Adresse-objekt av en Person ville ikke være reflektert i det andre objektet som du kan se av diagrammet i figur 8. Hvis vi tar en titt på koden i eksempel 9, kan du se at vi ikke bare bruker en kopi constructor på våre Person-objekt, men vi er også utnytte kopi konstruktører på indre objekter som godt.

Eksempel 9

ved Hjelp av denne dype kopiere, vi kan prøve mor-sønn eksempel fra Eksempel 6. Nå er sønnen er i stand til å flytte ut!,

Imidlertid, det er ikke slutten av historien. For å skape en ekte dyp kopi, vi trenger å beholde kopiering alt av Person-objekt er nestet elementer, inntil det bare primitive typer og «Immutables» til venstre. La oss se på Gaten klasse for å bedre illustrere dette:

Eksempel 10

Gaten objektet består av to eksempel variabler – String navn og int antall. int antall er en primitiv verdi og ikke et objekt. Det er bare en enkel verdi som ikke kan deles, så ved å opprette en ny forekomst variabel, er vi automatisk opprette en uavhengig kopi., String er en Uforanderlig. Kort sagt, en Uforanderlig er et Objekt, som, når den er laget, kan aldri bli endret igjen. Derfor, du kan dele det uten å måtte opprette en dyp kopi av det.

Konklusjon

for Å konkludere, jeg ønsker å snakke om noen koding teknikker vi har brukt i vår mor-sønn eksempel. Bare fordi en dyp kopi vil la deg endre det interne detaljer av et objekt, for eksempel Adresse-objektet, betyr det ikke at du bør., Dette ville redusere kode kvalitet, ettersom det vil gjøre Personen klasse mer sårbare for endringer – når Adressen klasse er endret, må du (potensielt) gjelder endringer i Person-klassen også. For eksempel, hvis Adressen klasse ikke lenger inneholder en Gate objekt, vil vi ha til å endre moveOut () – metoden i Person-klassen på toppen av de endringene vi allerede gjort til Adressen klasse.

I Eksempel 6 i denne artikkelen, jeg bare valgte å bruke en ny By og Street-objekt for å bedre illustrere forskjellen mellom en grunn og en dyp kopi., I stedet, vil jeg anbefale at du tilordne en ny Adresse objektet i stedet, effektivt konvertere til en hybrid av en grunn og en dyp 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-orientert form, dette bryter med innkapsling, og bør derfor unngås. Innkapsling er en av de viktigste aspektene av Objekt-Orientert programmering. I dette tilfellet hadde jeg brutt innkapsling ved å få tilgang til det interne opplysninger om Adresse-objekt i våre Person-klassen., Dette skader våre etiske fordi vi har nå blandet Person klasse i Adresse-klassen, og hvis vi gjør endringer i Adresse-klasse ned linjen, det kan skade Personen klasse som jeg forklarte ovenfor. Mens du trenger til å koble sammen ulike klasser å ha en koding prosjektet, når du kobler til to klasser, du trenger for å analysere kostnader og nytte.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *