Obiekty anonimowe
Implementacje inline
Obiekty anonimowe to bezpłatna lekcja Kotlin Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Kotlin Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Kotlin Academy zawiera 4 lekcji w sumie.
Implementacje tworzone w miejscu użycia
Obiekt anonimowy tworzy instancję klasy lub interfejsu bez nazywania nowej klasy. Należy użyć wyrażenia object.
interface Greeter { fun greet(): String }
fun main() {
val g = object : Greeter {
override fun greet() = "Hi"
}
println(g.greet())
}Implementowanie interfejsu
Wyrażenie object może implementować jeden lub więcej interfejsów dokładnie w miejscu, w którym jest potrzebne.
interface Clickable { fun click() }
fun main() {
val button = object : Clickable {
override fun click() = println("Clicked")
}
button.click()
}Przesłanianie elementów klasy
Można anonimowo utworzyć klasę dziedziczącą po klasie open i przesłonić jej elementy.
open class Animal { open fun sound() = "..." }
fun main() {
val cat = object : Animal() {
override fun sound() = "Meow"
}
println(cat.sound())
}Przechowywanie dodatkowego stanu
Obiekt anonimowy może deklarować własne właściwości poza tymi, które przesłania.
fun main() {
val point = object {
val x = 3
val y = 4
}
println("${point.x}, ${point.y}")
}Obiekt bez nadtypu
Jeśli nie zostanie podany nadtyp, obiekt jest po prostu doraźnym zbiorem elementów, przydatnym do szybkiego lokalnego grupowania.
fun main() {
val config = object {
val retries = 3
val timeout = 30
}
println(config.retries)
}Przechwytywanie zmiennych lokalnych
Obiekty anonimowe mogą przechwytywać zmienne z zakresu obejmującego, w przeciwieństwie do statycznych klas zagnieżdżonych.
fun makeCounter(start: Int): () -> Int {
var count = start
val obj = object {
fun next() = count++
}
return { obj.next() }
}
fun main() {
val c = makeCounter(10)
println(c())
println(c())
}Jako słuchacz
Częstym zastosowaniem jest przekazywanie implementacji tworzonej w miejscu użycia jako wywołania zwrotnego lub słuchacza.
interface OnDone { fun done(result: Int) }
fun compute(cb: OnDone) {
cb.done(42)
}
fun main() {
compute(object : OnDone {
override fun done(result: Int) = println("Got $result")
})
}Typ obiektu anonimowego
Gdy obiekt anonimowy jest zwracany z funkcji, wywnioskowany typ jest zadeklarowanym nadtypem (lub Any, jeśli go nie ma). Dodatkowe elementy są widoczne tylko lokalnie.
interface Named { val name: String }
fun make(): Named = object : Named {
override val name = "X"
}
fun main() {
println(make().name)
}Obiekty anonimowe a lambdy
W przypadku interfejsów z jedną metodą lambda jest krótsza, ale obiekty anonimowe są potrzebne, gdy trzeba przesłonić wiele elementów lub przechowywać stan.
interface Handler {
fun onStart()
fun onStop()
}
fun main() {
val h = object : Handler {
override fun onStart() = println("start")
override fun onStop() = println("stop")
}
h.onStart()
h.onStop()
}Wyrażenie object a deklaracja object
Wyrażenie object tworzy nową instancję przy każdym użyciu. Deklaracja object (object Name {}) jest nazwanym singletonem. Wyglądają podobnie, ale różnią się czasem życia.
object Singleton { val id = 1 }
fun main() {
val fresh = object { val id = 2 }
println(Singleton.id)
println(fresh.id)
}Zwięzły komparator
Obiekty anonimowe są przydatne do jednorazowych komparatorów lub strategii.
fun main() {
val cmp = object : Comparator<Int> {
override fun compare(a: Int, b: Int) = b - a
}
val list = listOf(1, 3, 2).sortedWith(cmp)
println(list)
}Szybkie sprawdzenie
Proszę sprawdzić swoją znajomość obiektów anonimowych.
Podsumowanie
W tej części poznali Państwo obiekty anonimowe:
- Wyrażenie
object : Type {}tworzy nienazwaną instancję. - Mogą implementować interfejsy, dziedziczyć po klasach open i przechowywać stan.
- Przechwytują zmienne lokalne z zakresu obejmującego.
- Należy ich używać do wywołań zwrotnych z wieloma metodami, a w przypadku pojedynczych metod preferować lambdy.
interface Run { fun go() }
fun main() {
val r = object : Run { override fun go() = println("go") }
r.go()
}Często zadawane pytania
Czy lekcja „Obiekty anonimowe” jest bezpłatna?
Tak — pełny tekst „Obiekty anonimowe” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Kotlin Academy, przejdź na CoddyKit PRO. Kurs Kotlin Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Obiekty anonimowe”?
Implementacje inline Ćwiczysz Kotlin Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Kotlin Academy?
Nie wymagamy żadnego doświadczenia. Kotlin Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Obiekty anonimowe”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Kotlin Academy?
Tak. Każda lekcja Kotlin Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Klasy zagnieżdżone
- Klasy wewnętrzne
- Obiekty anonimowe
- Klasy lokalne