Kotlin Academy · Lektion

Extension-egenskaper och beräknade extensions

Lägg till beräknade egenskaper i befintliga klasser utan att ärva från dem.

Lektion 2 av 413 steg

Extension-egenskaper och beräknade extensions ä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.

Extension properties

Extension properties lägger till beräknade egenskaper i befintliga typer utan att skapa subklasser. De har inget backing field.

Skrivskyddad extension property

Definiera en getter för att skapa en beräknad extension property.
val String.wordCount: Int
    get() = trim().split(Regex("\\s+")).size
println("hello world kotlin".wordCount)  // 3

Ändringsbar extension property

Definiera både getter och setter för en läs- och skrivbar extension property.
var MutableList<Int>.first: Int
    get() = this[0]
    set(value) { this[0] = value }
val list = mutableListOf(1, 2, 3)
list.first = 10
println(list)  // [10, 2, 3]

Inget backing field

Extension properties kan inte ha backing fields. De beräknas alltid utifrån befintligt tillstånd.
// ERROR: extension property cannot have backing field
// var String.cache: String = ""  // NOT allowed!

// OK: computed only:
val String.isPalindrome: Boolean
    get() = this == this.reversed()

Extension properties på samlingar

Lägg till praktiska egenskaper i samlingstyper.
val <T> List<T>.secondOrNull: T?
    get() = if (size >= 2) this[1] else null
val <T> List<T>.isNotNullOrEmpty: Boolean
    get() = isNotEmpty()
println(listOf(1, 2, 3).secondOrNull)  // 2

Booleska extension properties

Skapa lättlästa Boolean-egenskaper för typkontroller.
val Any.isString: Boolean get() = this is String
val String.hasDigits: Boolean get() = any { it.isDigit() }
val Int.isPositive: Boolean get() = this > 0
println(42.isPositive)        // true
println("abc123".hasDigits)   // true

Extension properties jämfört med extension functions

Använd en property när beräkningen är enkel och representerar en egenskap hos objektet. Använd en function när den har parametrar eller sidoeffekter.
// Property: stateless, simple characteristic
val String.isEmail: Boolean get() = '@' in this
// Function: has parameters
fun String.padCenter(width: Int) = padStart((length + width) / 2)

Utöka ett companion object

Lägg till extension properties i companion objects.
data class Color(val r: Int, val g: Int, val b: Int) {
    companion object
}
val Color.Companion.RED get() = Color(255, 0, 0)
val Color.Companion.WHITE get() = Color(255, 255, 255)
println(Color.RED)  // Color(r=255, g=0, b=0)

Kontextbundna extension properties

Extension properties som definieras inuti en klass gäller endast när Ni befinner Er inom den klassens scope.
class Formatter {
    val Int.formatted: String
        get() = "%,d".format(this)
    fun format(n: Int) = n.formatted
}
println(Formatter().format(1000000))  // 1,000,000

Använda extensions för DSL:er

Extension properties är grundläggande för design av Kotlin-DSL:er.
val Int.dp: Float get() = this * 2.5f
val Float.sp: Float get() = this * 1.0f
// In DSL context:
view.setPadding(16.dp.toInt())

Generiska extension properties

Extension properties kan ha typparametrar.
val <T> List<T>.head: T?
    get() = firstOrNull()
val <T> List<T>.tail: List<T>
    get() = drop(1)
println(listOf(1,2,3).head)  // 1
println(listOf(1,2,3).tail)  // [2, 3]

Snabbkontroll

Kan extension properties ha backing fields i Kotlin?

Sammanfattning

Extension properties lägger till beräknade egenskaper i typer utan backing fields. Använd dem för enkla, tillståndslösa beräkningar. Ändringsbara extension properties kan ha setters. De passar utmärkt för DSL:er och fluent API:er. Nästa steg: scoped extensions och companion extensions!
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 ”Extension-egenskaper och beräknade extensions” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Kotlin Academy, inklusive ”Extension-egenskaper och beräknade extensions”, 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 ”Extension-egenskaper och beräknade extensions”?

Lägg till beräknade egenskaper i befintliga klasser utan att ärva från dem. 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 ”Extension-egenskaper och beräknade extensions”?

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. Extension-funktioner: syntax och dispatch-regler
  2. Extension-egenskaper och beräknade extensions
  3. Områdesbegränsade extensions och companion extensions
  4. Praktiska extensions: Context-, View- och String-hjälpare
← Tillbaka till Kotlin Academy