Kotlin Academy · Lektion

Inline-värdeklasser

Omslut värden utan extra kostnad

Lektion 2 av 413 steg

Inline-värdeklasser är en gratis lektion i Kotlin Academy på CoddyKit. Detta är lektion 2 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Kotlin Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Kotlin Academy innehåller totalt 4 lektioner.

Problemet med omslagning

Att omsluta en primitiv typ i en klass ger typsäkerhet, men kostar normalt en heap-allokering. Värdeklasser ger samma säkerhet, medan kompilatorn eliminerar omslaget där det är möjligt.

Deklarera en värdeklass

Markera en klass med @JvmInline value class och exakt en egenskap i primärkonstruktorn. Den fungerar som en separat typ.

@JvmInline
value class Password(val value: String)

fun main() {
    val p = Password("secret")
    println(p.value)
}

En separat typ

Till skillnad från ett typalias är en värdeklass en separat typ. Du kan inte av misstag skicka in en vanlig String där en Password förväntas.

@JvmInline
value class Password(val value: String)

fun login(p: Password) = println("login with " + p.value)

fun main() {
    login(Password("hunter2"))
}

Noll overhead

Vid körning inlinear kompilatorn vanligtvis det underliggande värdet, så ingen extra objektallokering sker. En Password representeras som en vanlig String i de flesta kodvägar.

@JvmInline
value class Meters(val amount: Double)

fun main() {
    val d = Meters(5.0)
    println(d.amount) // stored inline as a Double
}

Metoder och egenskaper

Värdeklasser kan ha funktioner och beräknade egenskaper, precis som vanliga klasser.

@JvmInline
value class Celsius(val degrees: Double) {
    fun toFahrenheit() = degrees * 9 / 5 + 32
}

fun main() {
    println(Celsius(100.0).toFahrenheit())
}

Init-block för validering

Ett init-block låter dig validera det omslutna värdet när objektet skapas, vilket garanterar att varje instans är giltig.

@JvmInline
value class Percentage(val value: Int) {
    init {
        require(value in 0..100) { "out of range" }
    }
}

fun main() {
    println(Percentage(75).value)
}

Beräknade egenskaper

Du kan lägga till beräknade egenskaper som härleds från det enda lagrade värdet och därmed hålla logiken nära typen.

@JvmInline
value class Seconds(val value: Int) {
    val asMinutes: Double get() = value / 60.0
}

fun main() {
    println(Seconds(120).asMinutes)
}

Implementera gränssnitt

Värdeklasser kan implementera gränssnitt, vilket möjliggör polymorf användning. Observera att detta kan tvinga fram boxning när värdet behandlas som gränssnittstypen.

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())
}

När boxning sker

Omslaget kommer tillbaka (boxas) när värdet används som nullbart, som ett gränssnitt eller i en generisk samling. I dessa fall skapar kompilatorn ett riktigt objekt — fortfarande korrekt, men mindre effektivt.

@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 class jämfört med data class

En data class allokerar alltid ett objekt och kan innehålla flera egenskaper. En value class innehåller exakt en egenskap och är utformad för noll overhead. Välj värdeklasser för tunna, typsäkra wrappers runt ett enda värde.

Varför det spelar roll

Värdeklasser låter dig:

  • Förhindra att parametrar med samma typ blandas ihop
  • Koppla validering till en primitiv typ
  • Vanligtvis slippa kostnad vid körning

De är det typsäkra alternativet när alias inte räcker till.

Snabbtest

Testa dina kunskaper om inline-värdeklasser.

Sammanfattning

Du har lärt dig om inline-värdeklasser:

  • Deklareras med @JvmInline value class och en egenskap
  • En separat typ med vanligtvis noll overhead
  • Stöd för metoder, beräknade egenskaper och validering med init
  • Boxning sker när de är nullbara, generiska eller används som gränssnitt

Nästa steg: verkliga användningsfall.

Gratis att börja

Lär dig Kotlin med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
51
Lektioner
203

Vanliga frågor

Är lektionen ”Inline-värdeklasser” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Kotlin Academy, inklusive ”Inline-värdeklasser”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Kotlin Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Inline-värdeklasser”?

Omslut värden utan extra kostnad Ni övar på Kotlin Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Kotlin Academy?

Du behöver inga förkunskaper. Utbildningen i Kotlin Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.

Hur lång tid tar lektionen ”Inline-värdeklasser”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Kotlin Academy-lektionen?

Ja. Varje Kotlin Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Typalias
  2. Inline-värdeklasser
  3. Användningsområden
  4. Begränsningar
← Tillbaka till Kotlin Academy