Сompanion object (также Singleton)



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



Синглтон-свойство companion object достигается за счет того, что он создается внутри класса в качестве статического поля. Он будет инициализирован при первом обращении к нему или при создании первого экземпляра класса, в котором он объявлен.



Важно отметить, что companion object будет инициализирован первым, а затем уже будет создан экземпляр класса:



class MyClass {

init {

// Выполняется всегда после инициализации companion object

}



companion object {

init {

// Выполняется всегда перед блоком init содержащего класса

}

}

}



val myClass = MyClass()



Такому объекту можно не указывать свое имя, и обращаться к методам и свойствам объекта через имя содержащего его класса без явного указания имени объекта.



class SomeClass {



companion object {

fun create()

}

}



val someClass = SomeClass.create()



Компилируется в public static final class на Java. Работает подобно ключевому слову static в Java.