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