Анонимные объекты
Реализуйте интерфейсы на месте
«Анонимные объекты» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Вложенные классы
- Внутренние классы
- Анонимные объекты
- Локальные классы