Anonyymit oliot ja oliolausekkeet
Käyttäkää oliolausekkeita rajapintojen kertaluonteisten toteutusten luomiseen.
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.
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
- object-määritys: Kotlinin singletonit
- companion object: staattisen kaltaiset jäsenet Kotlinissa
- Anonyymit oliot ja oliolausekkeet
- Tehdasmetodit companion object -olion avulla