Inline-arvoluokat
Kääri arvoja ilman lisäkustannusta
Inline-arvoluokat 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.
Käärimisen ongelma
Primitiivin kääriminen luokkaan lisää tyyppiturvallisuutta, mutta aiheuttaa yleensä kekomuistin varauksen. Arvoluokat tarjoavat turvallisuuden, mutta kääntäjä poistaa kääreen mahdollisuuksien mukaan.
Arvoluokan määrittäminen
Merkitse luokka @JvmInline value class -määritteellä ja lisää pääkonstruktoriin täsmälleen yksi ominaisuus. Se toimii erillisenä tyyppinä.
@JvmInline
value class Password(val value: String)
fun main() {
val p = Password("secret")
println(p.value)
}Erillinen tyyppi
Toisin kuin tyyppialias, value-luokka on erillinen tyyppi. Et voi vahingossa välittää tavallista String-arvoa kohtaan, jossa odotetaan Password-tyyppiä.
@JvmInline
value class Password(val value: String)
fun login(p: Password) = println("login with " + p.value)
fun main() {
login(Password("hunter2"))
}Ei lisäkustannuksia
Ajon aikana kääntäjä yleensä upottaa taustalla olevan arvon suoraan käyttöön, joten ylimääräistä olioallokaatiota ei tarvita. Useimmissa koodipoluissa Password esitetään tavallisena String-arvona.
@JvmInline
value class Meters(val amount: Double)
fun main() {
val d = Meters(5.0)
println(d.amount) // stored inline as a Double
}Metodit ja ominaisuudet
Value-luokilla voi olla funktioita ja laskettuja ominaisuuksia aivan tavallisten luokkien tapaan.
@JvmInline
value class Celsius(val degrees: Double) {
fun toFahrenheit() = degrees * 9 / 5 + 32
}
fun main() {
println(Celsius(100.0).toFahrenheit())
}init-lohkot validointia varten
init-lohkon avulla voit validoida käärityn arvon konstruktion yhteydessä ja varmistaa, että jokainen instanssi on kelvollinen.
@JvmInline
value class Percentage(val value: Int) {
init {
require(value in 0..100) { "out of range" }
}
}
fun main() {
println(Percentage(75).value)
}Lasketut ominaisuudet
Voit lisätä laskettuja ominaisuuksia, jotka johdetaan ainoasta tallennetusta arvosta. Näin logiikka pysyy lähellä tyyppiä.
@JvmInline
value class Seconds(val value: Int) {
val asMinutes: Double get() = value / 60.0
}
fun main() {
println(Seconds(120).asMinutes)
}Rajapintojen toteuttaminen
Value-luokat voivat toteuttaa rajapintoja, mikä mahdollistaa polymorfisen käytön. Huomaa, että tämä voi pakottaa arvon boksaukseen, kun sitä käsitellään rajapintatyyppinä.
interface Describable {
fun describe(): String
}
@JvmInline
value class Money(val cents: Int) : Describable {
override fun describe() = "$" + cents / 100.0
}
fun main() {
println(Money(1599).describe())
}Milloin boksautus tapahtuu
Kääre tulee uudelleen käyttöön (boksautetaan), kun arvoa käytetään nullable-tyyppinä, rajapintana tai geneerisessä kokoelmassa. Näissä tapauksissa kääntäjä luo oikean olion — toiminta säilyy oikeana, mutta on hieman tehottomampaa.
@JvmInline
value class Id(val raw: Int)
fun main() {
val direct = Id(1) // inlined
val boxed: Id? = Id(2) // boxed because nullable
println("" + direct.raw + " " + boxed?.raw)
}value-luokka vai data class
data class varaa aina muistia oliolle ja voi sisältää useita ominaisuuksia. value class sisältää täsmälleen yhden ominaisuuden ja tavoittelee nollakustannusta. Valitse value-luokka, kun tarvitset ohuen ja tyyppiturvallisen kääreen yhden arvon ympärille.
Miksi tällä on merkitystä
Value-luokkien avulla voit:
- estää samantyyppisten parametrien sekoittamisen
- liittää primitiivityyppiin validoinnin
- välttää yleensä ajonaikaiset kustannukset
Ne tarjoavat tyyppiturvallisen ratkaisun tilanteisiin, joissa aliakset eivät riitä.
Pikatesti
Testaa, miten hyvin ymmärrät inline-value-luokat.
Kertaus
Opit inline-value-luokista seuraavaa:
- Ne määritellään muodossa
@JvmInline value class, ja niillä on yksi ominaisuus - Ne ovat erillisiä tyyppejä ja aiheuttavat yleensä nollakustannuksen
- Ne tukevat metodeja, laskettuja ominaisuuksia ja
init-validointia - Boksautus tapahtuu, kun arvo on nullable, geneerinen tai sitä käytetään rajapintana
Seuraavaksi tutustumme käytännön käyttötapauksiin.
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 ”Inline-arvoluokat” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Kotlin Academy-oppimispolun 3 oppituntia, myös oppitunnin “Inline-arvoluokat”. 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 ”Inline-arvoluokat”?
Kääri arvoja ilman lisäkustannusta 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 ”Inline-arvoluokat”-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
- Tyyppialiaset
- Inline-arvoluokat
- Käyttötapaukset
- Rajoitukset