Что такое 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, реализовывать паттерн "одиночка", определять объекты без класса и предоставлять гибкие средства композиции и организации кода.