Kotlin Academy · Oppitunti

Anonyymit oliot ja oliolausekkeet

Käyttäkää oliolausekkeita rajapintojen kertaluonteisten toteutusten luomiseen.

Oppitunti 3/413 vaihetta

Anonyymit oliot ja oliolausekkeet on ilmainen Kotlin Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/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.

Object-lausekkeet

Object-lauseke luo luokasta tai rajapinnasta nimettömän, kertaluonteisen instanssin. Se vastaa Kotlinissa Javan nimettömiä sisäluokkia, mutta on tehokkaampi.

Rajapinnan nimetön toteuttaminen

Luo upotettu toteutus syntaksilla object : Interface { ... }.

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

Tilallinen nimetön luokka

Nimettömät objektit voivat sisältää tilaa ja useita metodeja.

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

Nimettömän objektin tyyppi

Nimettömän objektin tyyppi päätellään automaattisesti. Kun objekti määritellään funktion tasolla, sen omat jäsenet ovat edelleen käytettävissä.

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

Nimettömän tyypin näkyvyys

Jos funktio palauttaa nimettömän objektin päätellyllä tyypillä, kutsuja näkee vain ylityypin. Nimettömän objektin omat lisäjäsenet eivät ole ulkoisesti käytettävissä.

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

Useita rajapintoja

Nimetön objekti voi toteuttaa useita rajapintoja yhdessä lausekkeessa.

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

Luokan laajentaminen

Nimetön objekti voi periä avoimen luokan ja korvata sen jäseniä.

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

Ympäröivien muuttujien kaappaaminen

Nimettömät objektit sulkevat sisäänsä ympäröivän näkyvyysalueen muuttujat, joten ne voivat lukea ja muokata niitä. Java puolestaan edellyttää final-määrettä.

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

Milloin nimettömiä objekteja kannattaa käyttää

Käytä nimettömiä objekteja kertaluonteisiin toteutuksiin, joille ei kannata luoda omaa luokkaa. Tyypillisiä käyttökohteita ovat callbackit, kuuntelijat ja vertailijat.

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

Suosi lambda-lausekkeita, kun mahdollista

Jos rajapinnalla on yksi abstrakti metodi (SAM), lambda-lauseke on object-lauseketta selkeämpi.

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

Nimetön ja nimetty object

Käytä muotoa object Name nimetylle singletonille. Käytä lausekkeessa muotoa object : Type kertaluonteiselle nimettömälle instanssille.

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

Pikatarkistus

Millä syntaksilla luodaan rajapinnan toteuttava nimetön instanssi suoraan lausekkeessa?

Kertaus

Object-lausekkeet luovat kertaluonteisia nimettömiä instansseja suoraan koodiin. Ne voivat toteuttaa rajapintoja, laajentaa luokkia, sisältää tilaa ja käyttää ympäröivän näkyvyysalueen muuttujia. Suosi lambda-lausekkeita yksimetodisille rajapinnoille ja käytä object-lausekkeita, kun tarvitset useita metodeja tai tilaa.

Aloita maksutta

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 ”Anonyymit oliot ja oliolausekkeet” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Kotlin Academy-oppimispolun 3 oppituntia, myös oppitunnin “Anonyymit oliot ja oliolausekkeet”. 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 ”Anonyymit oliot ja oliolausekkeet”?

Käyttäkää oliolausekkeita rajapintojen kertaluonteisten toteutusten luomiseen. 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 3/4.

Kuinka kauan ”Anonyymit oliot ja oliolausekkeet”-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

  1. object-määritys: Kotlinin singletonit
  2. companion object: staattisen kaltaiset jäsenet Kotlinissa
  3. Anonyymit oliot ja oliolausekkeet
  4. Tehdasmetodit companion object -olion avulla
← Takaisin: Kotlin Academy