0Pricing
Kotlin Academy · Урок

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

Используйте объектные выражения для создания разовых реализаций интерфейсов.

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

Выражения с объектами

Выражение с объектом создаёт анонимный разовый экземпляр класса или интерфейса — это аналог анонимных внутренних классов Java, но с большими возможностями.

Анонимная реализация интерфейса

Используйте object : Interface { ... }, чтобы создать реализацию непосредственно в месте использования.

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

Анонимный класс с состоянием

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

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

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

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

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

Раскрытие анонимного типа

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

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

Несколько интерфейсов

Анонимный объект может реализовывать несколько интерфейсов в одном выражении.

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

Расширение класса

Анонимные объекты могут расширять открытый класс, переопределяя его элементы.

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

Захват переменных внешней области

Анонимные объекты замыкают переменные из внешней области видимости (читают и изменяют их) — в отличие от требования Java использовать final.

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

Когда использовать анонимные объекты

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

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

По возможности предпочитайте лямбды

Если интерфейс содержит один абстрактный метод (SAM), лямбда понятнее, чем выражение с объектом.

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

Анонимный и объявленный объект

Используйте object Name для именованного синглтона. Используйте object : Type в выражении для разового анонимного экземпляра.

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

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

Какой синтаксис создаёт анонимный экземпляр, реализующий интерфейс непосредственно в месте использования?

Итоги

Выражения с объектами создают разовые анонимные экземпляры непосредственно в месте использования. Они могут реализовывать интерфейсы, расширять классы, хранить состояние и замыкать переменные внешней области. Для интерфейсов с одним методом предпочитайте лямбды; используйте выражения с объектами, когда нужны несколько методов или состояние.

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

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

Да — полный текст урока «Анонимные объекты и объектные выражения» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 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. Объявление object: синглтоны Kotlin
  2. companion object: статические элементы в Kotlin
  3. Анонимные объекты и объектные выражения
  4. Фабричные методы с companion object
← Назад к Kotlin Academy