Kotlin Academy · Oppitunti

copy ja equals

Automaattisesti luodut funktiot

Oppitunti 2/413 vaihetta

copy ja equals on ilmainen Kotlin Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Kotlin Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Kotlin Academy-kurssilla on yhteensä 4 oppituntia.

Automaattisesti luodut funktiot

toString-funktion lisäksi data-luokka luo automaattisesti funktiot equals, hashCode ja copy.

Nämä kolme tekevät data-luokkien vertaamisesta ja kloonaamisesta vaivatonta.

Rakenteellinen yhtäsuuruus

Automaattisesti luotu equals-funktio vertaa olioita niiden ominaisuuksien arvojen, ei identiteetin, perusteella.

Kaksi samanarvoista data-luokan ilmentymää ovat yhtäsuuria operaattorilla ==.

data class User(val name: String, val age: Int)

fun main() {
    val a = User("Alice", 30)
    val b = User("Alice", 30)
    println(a == b)
}

Eri arvot eivät ole yhtäsuuria

Jos muutatte mitä tahansa ominaisuutta, oliot eivät enää ole yhtäsuuria.

Yhtäsuuruus lasketaan jokaisesta primäärikonstruktorin ominaisuudesta.

data class User(val name: String, val age: Int)

fun main() {
    val a = User("Alice", 30)
    val b = User("Alice", 31)
    println(a == b)
}

Yhtäsuuruus ja identiteetti

Käyttäkää ==-operaattoria arvojen rakenteelliseen yhtäsuuruuteen ja ===-operaattoria viiteyhtäsuuruuteen eli identiteetin vertailuun.

Kaksi yhtäsuurta data-oliota voi olla muistissa eri ilmentymiä.

data class User(val name: String)

fun main() {
    val a = User("Alice")
    val b = User("Alice")
    println(a == b)  // values match
    println(a === b) // different instances
}

Yhdenmukainen hashCode

hashCode luodaan equals-funktion kanssa yhdenmukaiseksi: yhtäsuurten olioiden tiiviste on sama.

Siksi data-luokat toimivat oikein joukoissa ja map-rakenteiden avaimina.

data class Point(val x: Int, val y: Int)

fun main() {
    val a = Point(1, 2)
    val b = Point(1, 2)
    println(a.hashCode() == b.hashCode())
}

copy-funktio

copy luo uuden olion, joka on alkuperäisen kaltainen.

Muuttumattomien val-ominaisuuksien kanssa kopiointi on tapa luoda muokattu versio.

data class User(val name: String, val age: Int)

fun main() {
    val a = User("Alice", 30)
    val b = a.copy()
    println(b)
    println(a == b)
}

Kopiointi muutoksilla

Välittäkää copy-funktiolle nimettyjä argumentteja, jos haluatte muuttaa tiettyjä ominaisuuksia ja säilyttää loput ennallaan.

Tämä on vakiintunut tapa päivittää muuttumatonta dataa.

data class User(val name: String, val age: Int)

fun main() {
    val a = User("Alice", 30)
    val older = a.copy(age = 31)
    println(a)
    println(older)
}

Kopiointi säilyttää alkuperäisen ennallaan

copy ei koskaan muuta lähdeoliota. Alkuperäisen arvot säilyvät.

Tämä muuttumattomuus tekee tilan muutoksista ennakoitavia ja turvallisia.

data class Account(val owner: String, val balance: Int)

fun main() {
    val original = Account("Sam", 100)
    val updated = original.copy(balance = 150)
    println(original.balance)
    println(updated.balance)
}

Kopioiden ketjuttaminen

Koska copy palauttaa uuden olion, voitte tehdä useita päivityksiä peräkkäin.

Jokainen vaihe tuottaa uuden, itsenäisen arvon.

data class Config(val volume: Int, val muted: Boolean)

fun main() {
    val base = Config(50, false)
    val result = base.copy(volume = 70).copy(muted = true)
    println(result)
}

Vain konstruktorin ominaisuudet lasketaan mukaan

Kuten yhtäsuuruuskin, copy käsittelee vain primäärikonstruktorin ominaisuuksia.

Rungon ominaisuudet palautetaan kopiossa oletusarvoihinsa, joten säilyttäkää tärkeä tila konstruktorissa.

data class User(val name: String) {
    var note: String = "none"
}

fun main() {
    val a = User("Alice")
    a.note = "VIP"
    val b = a.copy()
    println(b.note) // back to default
}

Kootaan kokonaisuus

Automaattisesti luodut funktiot antavat data-luokille niiden voiman:

  • equals ja == vertaavat arvojen perusteella
  • hashCode pysyy yhdenmukaisena equals-funktion kanssa
  • copy kloonaa olion ja mahdollistaa valinnaiset muutokset
data class User(val name: String, val age: Int)

fun main() {
    val a = User("Alice", 30)
    val b = a.copy(name = "Alicia")
    println(a == b)
    println(b)
}

Pikatesti

Testatkaa, miten hyvin ymmärrätte copy- ja equals-funktiot.

Kertaus

Olette oppineet data-luokkien automaattisesti luoduista funktioista:

  • equals vertaa arvojen perusteella, == ja === toimivat eri tavoin
  • hashCode pysyy kokoelmissa yhdenmukaisena
  • copy kloonaa olion valikoiduilla muutoksilla

Seuraavaksi opitte, miten hajotelma purkaa oliot muuttujiksi.

Aloita maksutta

Opi Kotlin tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
51
Oppitunnit
203

Usein kysytyt kysymykset

Onko oppitunti ”copy ja equals” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Kotlin Academy-oppimispolun 3 oppituntia, myös oppitunnin “copy ja equals”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Kotlin Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”copy ja equals”?

Automaattisesti luodut funktiot Harjoittelet Kotlin Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Kotlin Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Kotlin Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”copy ja equals”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Kotlin Academy-oppitunnilla?

Kyllä. Jokainen Kotlin Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Data class -luokkien määrittäminen
  2. copy ja equals
  3. Hajotusmääritykset
  4. Data class -luokat kokoelmissa
← Takaisin: Kotlin Academy