Ключевое слово companion

Ключевое слово companion используется для создания компаньон объекта внутри класса. Компаньон объект является объектом, который связан с классом, а не с его экземплярами. Это позволяет обращаться к свойствам и методам компаньон объекта напрямую через имя класса, без создания экземпляра класса. Компаньон объект инициализируется при первом обращении к нему.

Синтаксис

kotlinclass MyClass {
  companion object {
    // свойства и методы компаньон объекта
  }
}
kotlinclass MyClass {
  companion object Name {
    // свойства и методы компаньон объекта с именем
  }
}

Пример

Создадим класс с компаньон объектом, содержащим свойство и метод:

kotlinclass Calculator {
  companion object {
    val PI = 3.14159
    
    fun add(a: Int, b: Int): Int {
      return a + b
    }
  }
}

Обращение к членам компаньон объекта:

kotlinval piValue = Calculator.PI
val sum = Calculator.add(5, 3)
println(piValue)
println(sum)

Результат выполнения кода:

kotlinDouble 3.14159
Int 8

Пример

Компаньон объект с именем и реализацией интерфейса:

kotlininterface Factory {
  fun create(): String
}

class Product {
  companion object Producer : Factory {
    override fun create(): String {
      return "Product created"
    }
  }
}

Использование именованного компаньон объекта:

kotlinval product = Product.Producer.create()
println(product)

Результат выполнения кода:

kotlinString "Product created"

Пример

Компаньон объект с фабричным методом для создания экземпляров класса:

kotlinclass User private constructor(val name: String) {
  companion object {
    fun createUser(name: String): User {
      return User(name)
    }
  }
}

Создание экземпляра через фабричный метод компаньон объекта:

kotlinval user = User.createUser("John")
println(user.name)

Результат выполнения кода:

kotlinString "John"

Пример

Доступ к приватным членам класса из компаньон объекта:

kotlinclass Configuration {
  private val configData = mutableMapOf<String, Any>()
  
  companion object {
    fun createDefault(): Configuration {
      val config = Configuration()
      config.configData["timeout"] = 30
      config.configData["retries"] = 3
      return config
    }
  }
  
  fun getConfig(): Map<String, Any> {
    return configData
  }
}

Использование фабричного метода:

kotlinval config = Configuration.createDefault()
val configData = config.getConfig()
println(configData)

Результат выполнения кода:

kotlinMap {timeout=30, retries=3}

Смотрите также

  • object,
    ключевое слово для создания объектов-одиночек
  • class,
    ключевое слово для объявления классов
  • static,
    статические члены классов в других языках программирования
  • const,
    ключевое слово для объявления констант времени компиляции