object в Kotlin — это декларативный способ создания синглтон-объекта с ленивой инициализацией и потокобезопасностью по умолчанию. Ключевое слово object заменяет целый класс с единственным экземпляром и используется для объявления singleton, companion object, анонимных объектов и статических утилит. Согласно JetBrains Kotlin Documentation (2026), object declaration — самый простой и безопасный способ реализации singleton в JVM-мире.
Главное
object в Kotlin — это специальная форма объявления, которая одновременно определяет класс и создаёт его единственный экземпляр (синглтон). Это гибрид class declaration и instance creation в одной конструкции.
В Java для создания singleton требуется написать приватный конструктор, статическое поле, метод getInstance и обработать потокобезопасность. Kotlin object делает это одной строкой кода: object MySingleton { }. Компилятор самостоятельно генерирует потокобезопасную ленивую инициализацию, используя механизм static initializer в байт-коде JVM.
По данным Kotlin Language Specification (2026), object declaration компилируется в финальный класс с приватным конструктором и статическим полем INSTANCE, инициализируемым в статическом блоке. Это гарантирует атомарность инициализации на уровне JVM.
Object declaration (синглтон-объект) объявляется с помощью ключевого слова object, за которым следует имя. Тело объекта может содержать свойства, методы, init-блоки и наследовать другие классы или интерфейсы.
object DatabaseManager {
private val connection: String = "jdbc:postgresql://localhost:5432/app"
fun query(sql: String): List<Map<String, Any>> {
// executing the query
return emptyList()
}
}
// Usage
DatabaseManager.query("SELECT * FROM users")
Инициализация DatabaseManager происходит в момент первого обращения — лениво и потокобезопасно. Никакой дополнительный код для синхронизации не требуется.
Object может наследовать обычные классы и интерфейсы. Это позволяет использовать object в качестве реализации абстрактного класса или интерфейса с единственным экземпляром.
interface Logger {
fun log(message: String)
}
object ConsoleLogger : Logger {
override fun log(message: String) {
println("[LOG] $message")
}
}
companion object — это специальный object, объявленный внутри класса с ключевым словом companion. Он заменяет статические члены в Kotlin, так как в языке нет ключевого слова static.
class ApiClient {
companion object {
private const val BASE_URL = "https://api.example.com"
fun create(): ApiClient {
return ApiClient()
}
}
}
// Calling without creating an ApiClient instance
val client = ApiClient.create()
Companion object может иметь имя (по умолчанию Companion), реализовывать интерфейсы и быть расширяем через extension functions. В отличие от статических методов в Java, companion object — это полноценный объект, который может быть передан как аргумент или сохранён в переменную.
По данным Kotlin Best Practices (2026), companion object используется для фабричных методов, констант, и статических утилит, связанных с классом. При этом рекомендуется избегать избыточного использования companion object — для несвязанных утилит лучше применять топировочные функции.
Для совместимости с Java companion object можно аннотировать методами @JvmStatic. Это генерирует настоящий статический метод в байт-коде JVM, доступный из Java-кода без синтаксиса Companion.
Object expression — это анонимный объект, создаваемый на месте для переопределения методов класса или интерфейса без объявления отдельного именованного класса.
val handler = object : Runnable {
override fun run() {
println("Task executed")
}
}
thread(handler)
Object expressions отличаются от объявлений object тем, что они создают новый экземпляр при каждом выполнении. Они не являются синглтонами и не имеют имени. Анонимные объекты могут захватывать переменные из замыкания, как и лямбды.
В отличие от Java, где анонимные классы могут наследовать только один тип, Kotlin object expression может наследовать несколько типов одновременно.
interface Clickable {
fun click()
}
abstract class View {
abstract fun render()
}
val button = object : View(), Clickable {
override fun render() = println("Rendering button")
override fun click() = println("Button clicked")
}
Object — одна из самых универсальных конструкций Kotlin, применяемая во множестве сценариев.
В Android-проектах object часто используется для объявления Repository, где не требуется множественных экземпляров. Единый экземпляр гарантирует консистентность данных.
object UserRepository {
fun getUser(id: Int): User? {
// getting the user
return null
}
}
Companion object с фабричными методами — альтернатива множественным конструкторам. Named factory methods делают код самодокументируемым.
data class GsonParser {
companion object {
fun create(): GsonParser = GsonParser()
fun createPretty(): GsonParser = GsonParser()
}
}
Object может служить контейнером для констант, заменяя статические final поля в Java. При этом object поддерживает наследование, что позволяет создавать иерархии конфигураций.
По данным Kotlin Standard Library (2026), object declaration является наиболее производительным способом создания singleton в Kotlin, превосходя по скорости "double-checked locking" реализации и сопоставимый с enum singleton в Java.
Часто задаваемые вопросы
Object одновременно объявляет класс и создаёт его единственный экземпляр. Обычный класс может иметь множество экземпляров, создаваемых через конструктор.
Лениво — при первом обращении к объекту. До этого память не выделяется, и код в init-блоке не выполняется.
Нет, object не может иметь явного конструктора. Инициализация выполняется в init-блоке, который вызывается один раз при первом доступе к объекту.
companion object — это object, объявленный внутри класса. Его члены доступны через имя класса без создания экземпляра, что заменяет статические члены Java.
Да, инициализация object полностью потокобезопасна благодаря статическому инициализатору JVM. Никакая дополнительная синхронизация не требуется.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также