0Pricing
Kotlin Academy · Lekcja

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

  1. Klasy zagnieżdżone
  2. Klasy wewnętrzne
  3. Obiekty anonimowe
  4. Klasy lokalne
← Powrót do Kotlin Academy