Companion object в Kotlin
Блок companion object пишут внутри тела
class. У класса может быть только один
такой блок. Его члены не принадлежат отдельному
экземпляру: к ним обращаются по имени класса,
без переменной с объектом User:
class User(val name: String) {
companion object {
var defaultRole = "guest"
fun describeRole(): String =
"role=$defaultRole"
}
}
fun main() {
println(User.describeRole())
User.defaultRole = "admin"
println(User.describeRole())
}
Companion сам по себе - полноценный object
с именем по умолчанию Companion. Его
можно назвать явно, если к блоку нужно обращаться
по этому имени:
class ApiClient {
companion object Factory {
fun versionTag(): String = "v1"
}
}
fun main() {
println(ApiClient.versionTag())
println(ApiClient.Factory.versionTag())
}
Именованный companion не создаёт второй блок -
это то же самое объявление с другим именем типа
объекта. Второй companion object в одном
классе компилятор не разрешит.
Companion удобен, когда операция относится к типу
в целом: версия, роль по умолчанию, общий счётчик
созданных экземпляров. Создание объектов через
companion разберём отдельно; для глобального
сервиса без класса данных по-прежнему подходит
верхнеуровневый object.
Сделайте class Point(val x: Int, val y: Int)
с companion object, в котором fun zero(): Point
возвращает точку (0, 0). Выведите
Point.zero().
Добавьте в class Book companion object с
var catalogSize = 0 и методом
register(), увеличивающим счётчик.
Вызовите register() дважды и выведите
Book.catalogSize.