Kotlin Academy · Lektion

Extension-funktioner: Syntaks og dispatch-regler

Skriv extension-funktioner, og forstå semantikken for statisk dispatch.

Lektion 1 af 413 trin

Extension-funktioner: Syntaks og dispatch-regler er en gratis Kotlin Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Kotlin Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Kotlin Academy-kurset indeholder 4 lektioner i alt.

Hvad er udvidelsesfunktioner

Udvidelsesfunktioner lader dig tilføje nye funktioner til eksisterende klasser uden at ændre dem eller bruge nedarvning.

Grundlæggende syntaks for udvidelsesfunktioner

Sæt typen, du udvider, foran funktionsnavnet. Den kaldes modtagertypen.
fun String.shout(): String = uppercase() + "!"
println("hello".shout())  // HELLO!
fun Int.isEven() = this % 2 == 0
println(4.isEven())  // true

this i udvidelser

I en udvidelsesfunktion henviser 'this' til modtagerobjektet.
fun List<Int>.secondOrNull(): Int? {
    return if (size >= 2) this[1] else null
}
println(listOf(10, 20, 30).secondOrNull())  // 20
println(listOf(5).secondOrNull())           // null

Statisk opslag: Udvidelser tilsidesætter ikke

Udvidelsesfunktioner bestemmes statisk ved kompilering ud fra den erklærede type – de er IKKE virtuelle.
open class Base
class Child : Base()
fun Base.greet() = "Hello from Base"
fun Child.greet() = "Hello from Child"

val obj: Base = Child()
println(obj.greet())  // "Hello from Base" (static dispatch!)

Udvidelser kontra medlemsfunktioner

Hvis en klasse har en medlemsfunktion med samme signatur som en udvidelse, vinder medlemmet altid.
class Greeter {
    fun hello() = "member hello"
}
fun Greeter.hello() = "extension hello"  // shadowed!
println(Greeter().hello())  // "member hello"

Udvidelser med nullable-modtager

Du kan udvide nullable-typer. Indeni skal du håndtere null med kontroller af 'this == null'.
fun String?.orEmpty() = this ?: ""
fun Any?.toStringSafe() = this?.toString() ?: "null"
println(null.orEmpty())  // ""
println(42.toStringSafe())  // "42"

Synlighed og virkeområde

Udvidelser kan være på øverste niveau (globale), i en klasse (medlemsudvidelser) eller i en fil. De følger de normale synlighedsregler.
// Top-level extension:
fun List<String>.joinUppercase() = joinToString { it.uppercase() }
// Private to file:
private fun String.clean() = trim().lowercase()

Udvidelser af companion object

Tilføj udvidelser til et companion object for at udvide navnerummet på klasseniveau.
class User(val name: String) {
    companion object
}
fun User.Companion.guest() = User("Guest")
val guest = User.guest()

Udvidelser af standardbibliotekets typer

Udvid enhver type – også indbyggede typer.
fun Double.roundTo(decimals: Int): Double {
    val factor = Math.pow(10.0, decimals.toDouble())
    return Math.round(this * factor) / factor
}
println(3.14159.roundTo(2))  // 3.14

Organisering af udvidelser

Gruppér udvidelser til en type i en dedikeret fil, f.eks. StringExtensions.kt eller DateExtensions.kt.
// StringExtensions.kt
fun String.titleCase() = split(" ")
    .joinToString(" ") {
        it.replaceFirstChar { c -> c.uppercase() }
    }
println("hello world".titleCase())  // Hello World

Udvidelser kan ikke få adgang til private medlemmer

Udvidelser har kun adgang til offentlige og interne medlemmer – ikke private eller beskyttede medlemmer.
class Secret {
    private val key = "hidden"
    val name = "public"
}
fun Secret.reveal() {
    println(name)  // OK
    // println(key)  // Error: key is private
}

Hurtigt tjek

Hvis en klasses medlemsfunktion og en udvidelsesfunktion har samme signatur, hvilken bliver så kaldt?

Opsummering

Udvidelsesfunktioner tilføjer funktionalitet til enhver klasse uden ændringer. De bruger statisk opslag (ingen tilsidesættelse). Medlemmer vinder over udvidelser. Brug nullable-modtagere til null-sikre hjælpefunktioner. Næste emne: udvidelsesegenskaber!
Gratis at komme i gang

Lær Kotlin med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
51
Lektioner
203

Ofte stillede spørgsmål

Er lektionen “Extension-funktioner: Syntaks og dispatch-regler” gratis?

Ja — alle 3 lektioner i læringssporet Kotlin Academy, inklusive “Extension-funktioner: Syntaks og dispatch-regler”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Kotlin Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Extension-funktioner: Syntaks og dispatch-regler”?

Skriv extension-funktioner, og forstå semantikken for statisk dispatch. Du øver dig i Kotlin Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Kotlin Academy?

Der kræves ingen tidligere erfaring. Kotlin Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.

Hvor lang tid tager lektionen “Extension-funktioner: Syntaks og dispatch-regler”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Kotlin Academy-lektion?

Ja. Alle Kotlin Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Extension-funktioner: Syntaks og dispatch-regler
  2. Extension-egenskaber og beregnede extensions
  3. Scoped extensions og companion extensions
  4. Praktiske extensions: Hjælpere til Context, View og String
← Tilbage til Kotlin Academy