Kotlin Academy · Oppitunti

Rajoitukset

Mitä arvoluokat eivät voi tehdä

Oppitunti 4/413 vaihetta

Rajoitukset on ilmainen Kotlin Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/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.

Rajojen tunteminen

Value-luokat ovat tehokkaita, mutta niillä on rajoituksia. Kun ymmärrät niiden rajat, osaat valita oikean työkalun ja vältät yllätykset.

Täsmälleen yksi ominaisuus

Value-luokka käärii yhden arvon. Jos haluat ryhmitellä useita kenttiä, tarvitset tavallisen luokan tai data class -luokan.

// @JvmInline value class Range(val lo: Int, val hi: Int) // not allowed

data class Range(val lo: Int, val hi: Int)

fun main() {
    println(Range(1, 10))
}

Ei muuta tilaa kuin arvo

Value-luokilla ei voi olla muita taustakenttiä kuin ainoa konstruktorin ominaisuus. Ylimääräinen var-tila, jolla on taustakenttä, ei ole sallittu.

@JvmInline
value class Counter(val value: Int) {
    // val cached: Int = value * 2  // not allowed: extra backing field
    val doubled: Int get() = value * 2  // computed is fine
}

fun main() {
    println(Counter(3).doubled)
}

Ei perintää

Value-luokat ovat implisiittisesti final-luokkia. Ne eivät voi periä muita luokkia, eikä niistä voi periä. Ne voivat ainoastaan toteuttaa rajapintoja.

interface Named { val label: String }

@JvmInline
value class Tag(val text: String) : Named {
    override val label: String get() = text
}

fun main() {
    println(Tag("urgent").label)
}

Boksauksen kustannukset palaavat

Nollakustannuksen lupaus ei päde, kun arvoa käytetään nullable-, geneerisenä tai rajapintatyyppinä. Tällöin kääntäjä boksaa arvon oikeaksi olioksi.

@JvmInline
value class Id(val raw: Int)

fun main() {
    val list: List<Id> = listOf(Id(1), Id(2)) // boxed inside the list
    println(list.map { it.raw })
}

Ei identiteettiä

Value-luokilla ei ole pysyvää viiteidentiteettiä. Viitteiden yhtäsuuruus operaattorilla === on merkityksetöntä, eikä niitä voi käyttää tilanteissa, joissa olion identiteetillä on merkitystä, kuten synkronointilukkona.

@JvmInline
value class Code(val value: Int)

fun main() {
    val a = Code(5)
    val b = Code(5)
    println(a == b)   // structural equality works
}

Ei lateinit- tai delegointitukea

Et voi käyttää lateinit-määrettä taustalla olevaan arvoon, eivätkä value-luokat tue ominaisuuksien delegointia ainoassa kentässään. Arvo on asetettava konstruktorissa.

@JvmInline
value class Slug(val value: String)

fun main() {
    val s = Slug("hello-world") // must be provided up front
    println(s.value)
}

JVM:n nimien muokkaus

JVM:llä value-luokan parametreja käyttävien funktioiden nimet muokataan tavukoodissa nimikonfliktien välttämiseksi. Tämä vaikeuttaa Java-yhteentoimivuutta, eivätkä Java-kutsujat välttämättä näe niitä selkeästi.

@JvmInline
value class Hz(val value: Int)

fun tune(freq: Hz) = freq.value

fun main() {
    println(tune(Hz(440))) // simple from Kotlin; mangled from Java
}

Ei usean kentän kääreille

Jos huomaat kaipaavasi kahta ominaisuutta, value-luokka on väärä työkalu. Valitse silloin data class ja hyväksy olion allokointi rakenteen monipuolisuuden vastineeksi.

data class Coordinate(val lat: Double, val lng: Double)

fun main() {
    println(Coordinate(41.0, 29.0))
}

Rajoitusten yhteenveto

Value-luokat eivät voi:

  • sisältää useampaa kuin yhtä ominaisuutta
  • sisältää ylimääräisiä taustakenttiä tai käyttää lateinit-määrettä
  • periä luokkia tai toimia luokkien yliluokkina
  • tarjota viiteidentiteettiä
  • välttää boksautusta aina

Valitse viisaasti

Käytä value-luokkaa yksittäiselle validoidulle ja tyyppiturvalliselle arvolle. Käytä data class -luokkaa ryhmitellylle tiedolle. Käytä tyyppialiasta, kun haluat vain parantaa luettavuutta ilman lisäturvallisuutta. Jokaisella on oma käyttötarkoituksensa.

Pikatesti

Testaa, miten hyvin ymmärrät value-luokkien rajoitukset.

Kertaus

Opit value-luokkien rajoituksista seuraavaa:

  • vain yksi ominaisuus, ei ylimääräisiä taustakenttiä
  • ei perintää eikä identiteettiä
  • boksautus palaa nullable-, geneerisessä tai rajapintakäytössä
  • JVM:n nimien muokkaus vaikeuttaa Java-yhteentoimivuutta

Sovita työkalu tarpeeseen.

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 ”Rajoitukset” ilmainen?

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

Mitä arvoluokat eivät voi tehdä 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 4/4.

Kuinka kauan ”Rajoitukset”-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. Tyyppialiaset
  2. Inline-arvoluokat
  3. Käyttötapaukset
  4. Rajoitukset
← Takaisin: Kotlin Academy