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

В языке Kotlin отсутствует ключевое слово static, которое присутствует в таких языках как Java и C#. Вместо него для реализации статических членов класса используются компаньон-объекты (companion object) и объекты-одиночки (object declaration). Компаньон-объекты позволяют определять статические методы и свойства, которые принадлежат классу, а не его экземплярам.

Синтаксис компаньон-объекта

kotlinclass MyClass {
  companion object {
    // статические свойства и методы
    val staticProperty: String = "value"
    fun staticMethod(): String {
      return "Hello from static method"
    }
  }
}

Пример

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

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

Пример

Обращение к статическим членам класса без создания экземпляра:

kotlinval piValue = Calculator.PI
val sum = Calculator.add(5, 3)
println("PI: $piValue")
println("Sum: $sum")

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

kotlinPI: 3.14159
Sum: 8

Синтаксис объекта-одиночки

kotlinobject Singleton {
  val property: String = "value"
  fun method(): String {
    return "Hello from singleton"
  }
}

Пример

Использование объекта-одиночки для создания глобально доступного экземпляра:

kotlinobject AppConfig {
  val version: String = "1.0.0"
  val maxConnections: Int = 10
  
  fun getDatabaseUrl(): String {
    return "jdbc:mysql://localhost:3306/mydb"
  }
}
kotlinprintln("App version: ${AppConfig.version}")
println("Database URL: ${AppConfig.getDatabaseUrl()}")

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

kotlinApp version: 1.0.0
Database URL: jdbc:mysql://localhost:3306/mydb

Пример

Компаньон-объекты могут иметь имя и реализовывать интерфейсы:

kotlininterface Factory {
  fun create(): String
}

class Product {
  companion object NamedCompanion : Factory {
    override fun create(): String {
      return "Product created"
    }
    
    fun getInfo(): String {
      return "Product information"
    }
  }
}
kotlinval product = Product.create()
val info = Product.NamedCompanion.getInfo()
println(product)
println(info)

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

kotlinProduct created
Product information

Пример

Инициализация компаньон-объекта с помощью блока init:

kotlinclass Logger {
  companion object {
    val logLevel: String
    
    init {
      logLevel = "DEBUG"
      println("Companion object initialized")
    }
    
    fun log(message: String) {
      println("[$logLevel] $message")
    }
  }
}
kotlinLogger.log("Application started")

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

kotlinCompanion object initialized
[DEBUG] Application started

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

  • ключевое слово final,
    которое используется запрета наследования и переопределения
  • ключевое слово open,
    которое разрешает наследование и переопределение
  • ключевое слово override,
    которое используется для переопределения методов и свойств