Объект-компаньон является одноэлементным, и к его членам можно обращаться напрямую через имя содержащего класса (хотя вы также можете вставить имя объекта-компаньона, если хотите явно указать доступ к объекту-компаньону)
Сопутствующий объект инициализируется при загрузке класса (как правило, в первый раз, когда на него ссылается другой код, который выполняется), в поточно-ориентированном режиме. Вы можете опустить имя, и в этом случае по умолчанию используется имя Companion. У класса может быть только один объект-компаньон, а объекты-компаньоны не могут быть вложенными.
class Car(val horsepowers: Int) {
companion object Factory {
val cars = mutableListOf<Car>()
fun makeCar(horsepowers: Int): Car {
val car = Car(horsepowers)
cars.add(car)
return car
}
}
}
val car = Car.makeCar(150)
println(Car.Factory.cars.size)
Преимущество объектов-компаньонов по сравнению с членами stati c заключается в том, что они могут наследовать от других классов или реализовывать интерфейсы и обычно ведут себя как любой другой синглтон.