0Pricing
Kotlin Academy · Урок

Анонимные объекты

Реализуйте интерфейсы на месте

«Анонимные объекты» — бесплатный урок Kotlin Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Kotlin Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Kotlin Academy содержит 4 уроков всего.

Реализации на месте

Анонимный объект создаёт экземпляр класса или интерфейса без объявления нового именованного класса. Используйте выражение object.

interface Greeter { fun greet(): String }

fun main() {
    val g = object : Greeter {
        override fun greet() = "Hi"
    }
    println(g.greet())
}

Реализация интерфейса

Выражение object позволяет реализовать один или несколько интерфейсов непосредственно в месте использования.

interface Clickable { fun click() }

fun main() {
    val button = object : Clickable {
        override fun click() = println("Clicked")
    }
    button.click()
}

Переопределение членов класса

Можно анонимно создать подкласс открытого класса и переопределить его члены.

open class Animal { open fun sound() = "..." }

fun main() {
    val cat = object : Animal() {
        override fun sound() = "Meow"
    }
    println(cat.sound())
}

Хранение дополнительного состояния

Анонимный объект может объявлять собственные свойства сверх тех, которые он переопределяет.

fun main() {
    val point = object {
        val x = 3
        val y = 4
    }
    println("${point.x}, ${point.y}")
}

Объект без супертипа

Если не указывать супертип, объект становится просто специальным набором членов, удобным для быстрой локальной группировки.

fun main() {
    val config = object {
        val retries = 3
        val timeout = 30
    }
    println(config.retries)
}

Захват локальных переменных

Анонимные объекты могут захватывать переменные из объемлющей области видимости, в отличие от статических вложенных классов.

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

В роли слушателя

Один из распространённых вариантов использования — передача реализации на месте в качестве обратного вызова или слушателя.

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

Тип анонимного объекта

При возврате из функции выведенный типом считается объявленный супертип (или Any, если супертип не указан). Дополнительные члены видны только локально.

interface Named { val name: String }

fun make(): Named = object : Named {
    override val name = "X"
}

fun main() {
    println(make().name)
}

Анонимные объекты и лямбда-выражения

Для интерфейсов с одним методом лямбда-выражение короче, но анонимные объекты нужны, когда необходимо переопределить несколько членов или хранить состояние.

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

Выражение object и объявление object

Выражение object создаёт новый экземпляр при каждом использовании. Объявление object (object Name {}) представляет собой именованный объект-одиночку. Они выглядят похоже, но отличаются временем жизни.

object Singleton { val id = 1 }

fun main() {
    val fresh = object { val id = 2 }
    println(Singleton.id)
    println(fresh.id)
}

Компактный компаратор

Анонимные объекты удобны для разовых компараторов или стратегий.

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

Быстрая проверка

Проверьте, насколько хорошо Вы поняли анонимные объекты.

Итоги

Вы узнали об анонимных объектах:

  • Выражение object : Type {} создаёт безымянный экземпляр.
  • Они могут реализовывать интерфейсы, быть подклассами открытых классов и хранить состояние.
  • Они захватывают локальные переменные из объемлющей области.
  • Используйте их для обратных вызовов с несколькими методами, а для одного метода предпочитайте лямбда-выражения.
interface Run { fun go() }

fun main() {
    val r = object : Run { override fun go() = println("go") }
    r.go()
}

Часто задаваемые вопросы

Урок «Анонимные объекты» бесплатный?

Да — полный текст урока «Анонимные объекты» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Kotlin Academy, подпишись на CoddyKit PRO. Курс Kotlin Academy содержит 4 уроков всего.

Чему я научусь в уроке «Анонимные объекты»?

Реализуйте интерфейсы на месте Ты практикуешь Kotlin Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Kotlin Academy?

Предыдущий опыт не требуется. Kotlin Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Анонимные объекты»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Kotlin Academy?

Да. Каждый урок Kotlin Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Вложенные классы
  2. Внутренние классы
  3. Анонимные объекты
  4. Локальные классы
← Назад к Kotlin Academy