Kotlin Academy · leksjon

Anonyme objekter og objektuttrykk

Bruk objektuttrykk til å opprette engangsimplementasjoner av grensesnitt.

Leksjon 3 av 413 trinn

Anonyme objekter og objektuttrykk er en gratis leksjon i Kotlin Academy på CoddyKit. Dette er leksjon 3 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Kotlin Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Kotlin Academy inneholder totalt 4 leksjoner.

Objektuttrykk

Et objektuttrykk oppretter en anonym engangsinstans av en klasse eller et grensesnitt – Kotlin-ekvivalenten til Javas anonyme indre klasser, men med større muligheter.

Implementere et grensesnitt anonymt

Bruk object : Interface { ... } for å opprette en implementering direkte i uttrykket.

interface ClickListener {
    fun onClick(): String
}
fun main() {
    val listener = object : ClickListener {
        override fun onClick() = "clicked!"
    }
    println(listener.onClick())
}

Anonym klasse med tilstand

Anonyme objekter kan inneholde tilstand og ha flere metoder.

fun main() {
    val counter = object {
        var count = 0
        fun inc() { count++ }
        fun show() = println("count = $count")
    }
    counter.inc(); counter.inc(); counter.inc()
    counter.show()
}

Typen til et anonymt objekt

Typen til et anonymt objekt utledes automatisk. Når objektet deklareres på funksjonsnivå, beholder De tilgang til de egendefinerte medlemmene.

fun main() {
    val pair = object {
        val left = "L"
        val right = "R"
    }
    println("${pair.left} and ${pair.right}")
}

Eksponering av anonym type

Hvis et anonymt objekt returneres fra en funksjon med en utledet type, ser kallere bare supertypen – de anonyme tilleggene er ikke tilgjengelige utenfra.

fun makeListener() = object {
    fun greet() = "hello"
}
fun main() {
    val l = makeListener()
    println(l.greet()) // OK — same compilation unit
}

Flere grensesnitt

Et anonymt objekt kan implementere flere grensesnitt i ett uttrykk.

interface Closeable { fun close() }
interface Flushable { fun flush() }
fun main() {
    val resource = object : Closeable, Flushable {
        override fun close() = println("closed")
        override fun flush() = println("flushed")
    }
    resource.flush()
    resource.close()
}

Utvide en klasse

Anonyme objekter kan utvide en åpen klasse og samtidig overstyre medlemmer.

open class Animal(val name: String) {
    open fun speak() = "$name makes a sound"
}
fun main() {
    val pet = object : Animal("Rex") {
        override fun speak() = "$name barks!"
    }
    println(pet.speak())
}

Fange inn variabler fra det omsluttende området

Anonyme objekter kan bruke og endre variabler i det omsluttende området – i motsetning til Javas krav om final.

fun main() {
    var log = mutableListOf<String>()
    val recorder = object {
        fun record(s: String) { log.add(s) }
    }
    recorder.record("event 1")
    recorder.record("event 2")
    println(log)
}

Når bør De bruke anonyme objekter

Bruk anonyme objekter for engangsimplementeringer som ikke fortjener sin egen klasse – vanligvis callback-funksjoner, lyttere og komparatorer.

fun main() {
    val nums = listOf(3, 1, 4, 1, 5, 9, 2, 6)
    val sorted = nums.sortedWith(object : Comparator<Int> {
        override fun compare(a: Int, b: Int) = b - a // descending
    })
    println(sorted)
}

Foretrekk lambdafunksjoner når det er mulig

Hvis grensesnittet har én abstrakt metode (SAM), er en lambdafunksjon ryddigere enn et objektuttrykk.

fun main() {
    val nums = listOf(3, 1, 4, 1, 5, 9)
    // Old way:
    val sorted1 = nums.sortedWith(object : Comparator<Int> {
        override fun compare(a: Int, b: Int) = b - a
    })
    // New way — SAM conversion:
    val sorted2 = nums.sortedWith(Comparator { a, b -> b - a })
    println("$sorted1 / $sorted2")
}

Anonymt kontra deklarert objekt

Bruk object Name for en navngitt singleton. Bruk object : Type i et uttrykk for en anonym engangsinstans.

// Named singleton (one instance, accessed globally)
object GlobalLogger { fun log(m: String) = println("[L] $m") }
// Anonymous (created at expression evaluation)
fun main() {
    val local = object { fun hi() = "hi" }
    GlobalLogger.log("hello")
    println(local.hi())
}

Rask kontroll

Hvilken syntaks oppretter en anonym instans som implementerer et grensesnitt direkte i uttrykket?

Oppsummering

Objektuttrykk oppretter anonyme engangsinstanser direkte i uttrykket. De kan implementere grensesnitt, utvide klasser, inneholde tilstand og bruke variabler fra det omsluttende området. Foretrekk lambdafunksjoner for grensesnitt med én metode, og bruk objektuttrykk når De trenger flere metoder eller tilstand.

Gratis å komme i gang

Lær deg Kotlin med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
51
Leksjoner
203

Ofte stilte spørsmål

Er leksjonen «Anonyme objekter og objektuttrykk» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Kotlin Academy, inkludert «Anonyme objekter og objektuttrykk», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Kotlin Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Anonyme objekter og objektuttrykk»?

Bruk objektuttrykk til å opprette engangsimplementasjoner av grensesnitt. Du øver på Kotlin Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Kotlin Academy?

Ingen tidligere erfaring er nødvendig. Kotlin Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.

Hvor lang tid tar leksjonen «Anonyme objekter og objektuttrykk»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Kotlin Academy-leksjonen?

Ja. Alle Kotlin Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. object-deklarasjon: Kotlin-singletons
  2. companion object: Statisk-lignende medlemmer i Kotlin
  3. Anonyme objekter og objektuttrykk
  4. Fabrikkmetoder med companion object
← Tilbake til Kotlin Academy