Что такое object в Kotlin?

В Kotlin ключевое слово object используется для объявления синглтонов, анонимных объектов и объектов-компаньонов (companion objects). Это один из мощнейших инструментов языка, позволяющий выразить статическое поведение, реализовать паттерн "одиночка", передавать объекты без явного объявления класса и создавать фабрики или хранилища состояния.

1. Объявление объекта-синглтона

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

Пример:

object AppConfig {
val apiUrl = "https://api.example.com"
fun printConfig() {
println("API = $apiUrl")
}
}

Обращение:

AppConfig.printConfig()

Особенности:

  • Создаётся при первом обращении (lazy).

  • Экземпляр — синглтон.

  • Можно реализовывать интерфейсы и наследовать классы (кроме data class).

2. Объекты как замена статическим методам

В отличие от Java, где есть static, в Kotlin его нет. Поэтому object — способ создать статическое поведение:

object MathUtils {
fun square(x: Int): Int = x \* x
}

Это примерно аналог public static методов в Java, но с возможностью более мощной организации кода (инкапсуляция, интерфейсы, lazy инициализация).

3. Анонимные объекты (anonymous object)

Можно создать объект на лету — без объявления отдельного класса:

val clickListener = object : View.OnClickListener {
override fun onClick(v: View?) {
println("Clicked!")
}
}

Особенности:

  • Можно реализовать интерфейсы и наследовать классы.

  • Объект не является синглтоном, создаётся новый экземпляр при каждом вызове.

Пример с передачей в метод:

fun handle(callback: Any) {
println(callback.toString())
}
handle(object {
val value = 42
})

Анонимные объекты полезны для реализации интерфейсов "на месте" — как Runnable, Comparator, Listener и т.д.

4. Объект-компаньон (companion object)

Если нужно добавить "статическое поведение" в класс, используется companion object.

class User(val name: String) {
companion object Factory {
fun create(name: String): User {
return User(name)
}
}
}

Вызов:

val user = User.create("Alice")

Особенности:

  • Только один companion object на класс.

  • Можно дать имя (как Factory выше), но можно и не давать.

  • Может содержать const val, @JvmStatic, быть доступным в Java.

Пример без имени:

class User {
companion object {
const val MAX_NAME_LENGTH = 30
}
}

5. Использование с интерфейсами

Объекты могут реализовывать интерфейсы:

interface Clickable {
fun click()
}
object Button : Clickable {
override fun click() = println("Clicked!")
}

6. Вложенные объекты (object expression внутри класса)

Можно создавать локальные объекты:

fun createComparator(): Comparator<Int> {
return object : Comparator<Int> {
override fun compare(a: Int, b: Int): Int = a - b
}
}

7. Object expression vs object declaration

Конструкция Время создания Используется для
object MySingleton Лениво, 1 раз Синглтон
--- --- ---
object : Interface Немедленно Анонимный объект
--- --- ---
companion object Лениво, 1 раз "Статическая" логика внутри класса
--- --- ---

8. Kotlin vs Java по части object

Java Kotlin
static object или companion object
--- ---
Singleton via private static object MySingleton
--- ---
Anonymous inner class object : Interface
--- ---
Factory class + static companion object Factory
--- ---

9. Использование с наследованием и sealed

Можно использовать object как часть sealed class, чтобы объявить фиксированное множество объектов:

sealed class Result
object Success : Result()
object Error : Result()

10. Возможности object в Kotlin Multiplatform

В multiplatform-проектах object можно использовать для кроссплатформенных синглтонов:

expect object Logger {
fun log(msg: String)
}

А в конкретной реализации (например, jvmMain) — дать реализацию actual object.

object — мощный инструмент языка Kotlin, который может использоваться как альтернатива static, реализовывать паттерн "одиночка", определять объекты без класса и предоставлять гибкие средства композиции и организации кода.