Анонимные объекты и объектные выражения
Используйте объектные выражения для создания разовых реализаций интерфейсов.
«Анонимные объекты и объектные выражения» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Объявление object: синглтоны Kotlin
- companion object: статические элементы в Kotlin
- Анонимные объекты и объектные выражения
- Фабричные методы с companion object