Kotlin Academy · Oppitunti

Mukautetut getterit ja setterit field-sanalla

Kirjoittakaa laskettuja ominaisuuksia ja mukautettuja settereitä backing field -avainsanan avulla.

Oppitunti 3/413 vaihetta

Mukautetut getterit ja setterit field-sanalla on ilmainen Kotlin Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/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.

Ominaisuudet eivät ole vain kenttiä

Jokaisella Kotlin-ominaisuudella on automaattisesti luotu getter (ja var-ominaisuudella myös setter). Voitte ohittaa ne logiikan lisäämiseksi — esimerkiksi validointia, lokitusta tai laskentaa varten.

Mukautettu getter

Ohittakaa get(), jos haluatte laskea arvon joka kerta, kun sitä luetaan.

class Circle(val radius: Double) {
    val area: Double
        get() = Math.PI * radius * radius
}
fun main() {
    val c = Circle(3.0)
    println(c.area) // ~28.27
}

Lasketut ominaisuudet

Lasketuilla ominaisuuksilla ei ole taustakenttää — niiden arvo lasketaan jokaisella käyttökerralla.

class Rectangle(val w: Int, val h: Int) {
    val area get() = w * h
    val perimeter get() = 2 * (w + h)
}
fun main() {
    val r = Rectangle(3, 4)
    println("${r.area}, ${r.perimeter}") // 12, 14
}

Mukautettu setter ja field

Mukautetun setterin sisällä field viittaa taustakenttään — varsinaiseen tallennustilaan.

class Temperature {
    var celsius: Double = 0.0
        set(value) {
            require(value >= -273.15) { "below absolute zero" }
            field = value
        }
}
fun main() {
    val t = Temperature()
    t.celsius = 25.0
    println(t.celsius)
    // t.celsius = -300.0 // throws
}

Taustakenttä luodaan automaattisesti

Jos getter tai setter käyttää field-tunnistetta, Kotlin luo taustakentän. Jos kumpikaan ei käytä sitä, kenttää ei luoda — ominaisuus on pelkästään laskettu.

class Counter {
    var count: Int = 0
        set(value) {
            println("Setting count from $field to $value")
            field = value
        }
}
fun main() {
    val c = Counter()
    c.count = 5
    c.count = 10
}

Sivuvaikutuksia sisältävä setter

Käyttäkää mukautettuja settereitä lokitukseen, muutoksista ilmoittamiseen tai toisiinsa liittyvän tilan synkronointiin.

class Brightness {
    var level: Int = 50
        set(value) {
            val clamped = value.coerceIn(0, 100)
            println("Brightness -> $clamped")
            field = clamped
        }
}
fun main() {
    val b = Brightness()
    b.level = 75
    b.level = 150 // clamps to 100
    println(b.level)
}

Yksityinen setter

Merkitkää setter private-määreellä, jos haluatte tarjota vain luku -rajapinnan mutta sallia sisäisen muuttamisen.

class Score {
    var value: Int = 0
        private set
    fun increment() { value++ }
    fun reset() { value = 0 }
}
fun main() {
    val s = Score()
    s.increment(); s.increment()
    println(s.value) // 2
    // s.value = 100 // ERROR: setter is private
}

Validointi setterissä

Mukautetut setterit ovat luonteva paikka syötteiden validointiin.

class Email {
    var address: String = ""
        set(value) {
            require(value.contains("@")) { "invalid email" }
            field = value
        }
}
fun main() {
    val e = Email()
    e.address = "ada@example.com"
    println(e.address)
}

Logiikkaa sisältävä getter

Getterit voivat muuntaa tallennettua tilaa — esimerkiksi muotoilla tallennetun arvon tai käyttää oletusarvoa varavaihtoehtona.

class Profile(_name: String?) {
    var rawName: String? = _name
    val displayName: String
        get() = rawName ?: "(unset)"
}
fun main() {
    val p = Profile(null)
    println(p.displayName) // (unset)
}

val- ja var-määritteiden vertailu

val-ominaisuuksilla on vain getter (ei setteriä); var-ominaisuuksilla on molemmat.

class Box {
    val readOnly: Int get() = 42
    var readWrite: Int = 0
}
fun main() {
    println(Box().readOnly)
    val b = Box(); b.readWrite = 5; println(b.readWrite)
}

Yleinen virhe: rekursio

Älkää käyttäkö ominaisuuden nimeä sen omassa aksessorissa — se aiheuttaa loputtoman rekursion. Käyttäkää sen sijaan field-tunnistetta.

class Wrong {
    var x: Int = 0
        set(value) {
            // x = value // INFINITE RECURSION — calls setter again
            field = value // CORRECT
        }
}
fun main() {
    val w = Wrong(); w.x = 42; println(w.x)
}

Pikatarkistus

Mihin field-tunniste viittaa mukautetun setterin sisällä?

Kertaus

Ylikirjoittakaa get()- ja set()-funktiot lisätäksenne logiikkaa ominaisuuden käyttöön. Lukekaa ja kirjoittakaa taustakenttää aksessoreissa field-tunnisteen avulla. Merkitkää setterit private-määreellä, kun julkisen rajapinnan tulee olla vain luku -tyyppinen. Käyttäkää laskettuja ominaisuuksia, joilla ei ole taustakenttää, kun arvo johdetaan aina muista tiedoista.

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 ”Mukautetut getterit ja setterit field-sanalla” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Kotlin Academy-oppimispolun 3 oppituntia, myös oppitunnin “Mukautetut getterit ja setterit field-sanalla”. 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 ”Mukautetut getterit ja setterit field-sanalla”?

Kirjoittakaa laskettuja ominaisuuksia ja mukautettuja settereitä backing field -avainsanan avulla. 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 3/4.

Kuinka kauan ”Mukautetut getterit ja setterit field-sanalla”-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. Ensisijainen konstruktori ja ominaisuusparametrit
  2. init-lohkot ja alustamisjärjestys
  3. Mukautetut getterit ja setterit field-sanalla
  4. lateinit ja laiska alustaminen
← Takaisin: Kotlin Academy