tässä artikkelissa minun ilmainen Java 8 Tietenkin, aion keskustella ero Syvä ja Matala Kopio. Voit ladata diat ja artikkelin PDF: nä täältä.
mikä on kopio?
aluksi haluan korostaa, mitä kopio Java on. Ensin erotellaan referenssikopio ja objektikopio. Viittaus kopio, kuten nimikin kertoo, luo kopio viittaus muuttuja osoittaa esineen., Jos meillä on Auto esine, jossa on myCar muuttuja osoittaa sen, ja me tehdä viittaus kopio, meillä on nyt kaksi myCar muuttujia, mutta vielä yksi kohde.
Esimerkki 1
objektin copy luo kopion esine itse. Joten jos me taas kopioitu automme esine, haluamme luoda kopion esine itse, samoin kuin toinen viittaus muuttujan vertailemalla, että kopioitu objekti.
Esimerkki 2:
Mikä On Esine?,
sekä syvä että Matala kopio ovat objektikopioiden tyyppejä, mutta mikä oikeasti on esine? Usein, kun puhumme esineestä, puhumme siitä yhtenä yksikkönä, jota ei voi enää hajottaa, kuten nöyrä kahvipapu. Se on kuitenkin liioiteltua.
Esimerkki 3.
– meillä on Henkilö, esine. Henkilöobjektimme koostuu itse asiassa muista esineistä, kuten esimerkistä 4 näkyy. Henkilö sisältää nimiobjektin ja Osoiteobjektin., Nimi puolestaan sisältää FirstName-ja LastName esine; Osoite-objekti koostuu Street kohde ja Kaupunki esine. Joten kun puhun henkilö tässä artikkelissa, puhun itse asiassa koko verkon esineitä.
Esimerkki 4.
Joten miksi emme halua kopioida tämä Henkilö esine? Objektikopio, jota kutsutaan yleensä klooniksi, luodaan, jos haluamme muokata tai siirtää objektia säilyttäen silti alkuperäisen objektin. On olemassa monia erilaisia tapoja kopioida objekti, että voit oppia toisessa artikkelissa., Tässä artikkelissa käytämme erityisesti copy constructor luoda kopioita.
Shallow Copy
First Let ’ s talk about the shallow copy. Pinnallinen kappale kappaleesta kopioi ’Pää’ – kappaleen, mutta ei kopioi sisempiä esineitä. ”Sisäobjektit” jaetaan alkuperäisen objektin ja sen kopion kesken. Esimerkiksi Henkilöobjektissamme loisimme toisen henkilön, mutta molemmat objektit jakaisivat saman nimen ja osoittaisivat objekteja.
katsotaan koodaava esimerkki. Esimerkissä 5 on luokkaihmisemme, joka sisältää nimen ja Osoiteobjektin., Copy constructor ottaa originalPerson-objektin ja kopioi sen viitemuuttujat.
Esimerkki 5.
ongelma matala kopio on, että kaksi esineitä eivät ole riippumattomia. Jos muokkaat yhden henkilön nimiobjektia, muutos heijastuu toisen henkilön objektiin.
sovelletaan tätä esimerkkinä. Sano, että meillä on henkilöobjekti, jolla on vertailumuuttuja äiti; sitten teemme kopion äidistä, luoden toisen persoonan objektin, poika. Jos myöhemmin koodissa poika yrittää liikuttaa () muokkaamalla Osoitekohdettaan, äiti liikkuu hänen kanssaan!,
Person mother = new Person(new Name(…), new Address(…));Person son = new Person(mother);son.moveOut(new Street(…), new City(…));
Esimerkki 6.
Tämä tapahtuu, koska meidän äiti ja poika esineitä jakaa saman Osoitteen esine, kuten näette havainnollistaa Esimerkki 7. Kun vaihdamme osoitteen yhdessä kohteessa, se muuttuu molemmissa!
Esimerkki 7.
Syvä Kopio
toisin Kuin matala kopio, syvä kopio on täysin riippumaton kopio kohde. Jos kopioisimme persoonamme objektin, kopioisimme koko objektin rakenteen.,
Esimerkki 8
muutos-Osoite, kohde on yksi Henkilö, ei olisi heijastunut muun esineen kuten näette kaavio Esimerkki 8. Jos me katsomaan koodi, esimerkissä 9, voit nähdä, että emme ole vain käyttäen copy constructor meidän Henkilö, esine, mutta olemme myös hyödyntämällä kopioi rakentajien sisä-esineitä samoin.
Esimerkki 9
Käyttämällä tätä syvä kopio, voimme uudelleen äiti-poika-esimerkki Esimerkki 6. Nyt poika pystyy onnistuneesti muuttamaan pois!,
se ei kuitenkaan ole tarinan loppu. Luodaksemme todellisen syvän kopion meidän täytyy jatkaa kaikkien persoonan objektin sisäkkäisten alkuaineiden kopioimista, kunnes jäljellä on vain primitiivisiä tyyppejä ja ”Immutables”. Katsotaanpa Street class paremmin havainnollistaa tätä:
Esimerkki 10
Kadulla kohde koostuu kahdesta instanssimuuttujat – String nimi ja int numero. int-luku on alkeellinen arvo eikä esine. Se on vain yksinkertainen arvo, jota ei voi jakaa, joten luomalla toisen asteen muuttuja luomme automaattisesti riippumattoman kopion., String on muuttumaton. Lyhyesti sanottuna muuttumaton on esine,jota ei voi luoda uudelleen. Siksi, voit jakaa sen ilman luoda syvä kopio.
Johtopäätös
lopuksi haluaisin puhua joitakin koodaus tekniikkaa käytimme meidän äiti-poika-esimerkki. Vaikka syvä kopio antaa sinun muuttaa kohteen sisäisiä yksityiskohtia, kuten Osoiteobjektia, se ei tarkoita, että sinun pitäisi., Näin vähenisi koodin laatua, koska se tekisi Henkilö-luokan hauras muutoksia – aina kun Osoite-luokka on muuttunut, sinun on (mahdollisesti) sovellettava muutokset Henkilö-luokassa myös. Esimerkiksi, jos Osoite luokka ei enää sisälly Katu-objekti, meidän täytyy muuttaa moveOut () – metodi Ihminen luokalle päälle muutoksia olemme jo tehneet Osoitteeseen luokan.
tämän artikkelin esimerkissä 6 valitsin vain uuden katu-ja kaupunkiobjektin kuvaamaan paremmin matalien ja syvien kopioiden eroa., Sen sijaan, suosittelen, että voit määrittää uuden Osoitteen kohde sen sijaan, tehokkaasti muuntaa hybridi matala ja syvä kopio, niin voit nähdä Esimerkki 10:
Person mother = new Person(new Name(…), new Address(…));Person son = new Person(mother);son.moveOut(new Address(...));
Esimerkki 11
olio-ehdot, tämä rikkoo kapselointi, ja siksi tulisi välttää. Kapselointi on olio-ohjelmoinnin tärkeimpiä osa-alueita. Tässä tapauksessa olin rikkonut kapselointia tutustumalla henkilöluokkamme Osoiteobjektin sisäisiin yksityiskohtiin., Tämä vahingoittaa meidän koodi, koska meillä on nyt sotkeutunut Henkilö-luokan Osoite, luokka, ja jos me teemme muutokset Osoite-luokan ruodussa, se voi vahingoittaa Henkilön luokkaa kuin selitin edellä. Kun sinun täytyy tietenkin yhteen eri luokat on koodaus projekti, kun liität kaksi luokat, sinun täytyy analysoida kustannuksia ja hyötyjä.