jvmstatic

Аннотация @JvmStatic используется для указания компилятору Kotlin сгенерировать статические методы в байт-коде JVM для функций-членов объекта или компаньона. Это обеспечивает совместимость с Java кодом, позволяя вызывать эти методы как статические из Java классов.

Синтаксис

kotlin@JvmStatic
fun methodName(parameters): ReturnType {
  // method body
}

Пример

Создадим объект с методом, помеченным аннотацией @JvmStatic:

kotlinobject StringUtils {
  @JvmStatic
  fun reverseString(input: String): String {
    return input.reversed()
  }
  
  fun capitalizeString(input: String): String {
    return input.capitalize()
  }
}

Метод reverseString будет доступен как статический из Java, а метод capitalizeString - только как метод экземпляра объекта.

Пример

Использование @JvmStatic в companion object:

kotlinclass Calculator {
  companion object {
    @JvmStatic
    fun add(a: Int, b: Int): Int {
      return a + b
    }
    
    fun subtract(a: Int, b: Int): Int {
      return a - b
    }
  }
}

Пример

Вызов методов из Kotlin кода:

kotlinval result1 = StringUtils.reverseString("hello")
val result2 = Calculator.add(5, 3)

println(result1)
println(result2)

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

kotlinString "olleh"
Int 8

Пример

Как эти методы будут выглядеть для Java кода:

java// Вызов статического метода
String reversed = StringUtils.reverseString("hello");
int sum = Calculator.add(5, 3);

// Вызов нестатического метода
String capitalized = StringUtils.INSTANCE.capitalizeString("hello");
int difference = Calculator.Companion.subtract(5, 3);

Пример

Использование @JvmStatic для свойств:

kotlinobject AppConfig {
  @JvmStatic
  val VERSION = "1.0.0"
  
  @JvmStatic
  var DEBUG_MODE = false
}

В Java эти свойства будут доступны через статические геттеры и сеттеры.

Примечания

Аннотация @JvmStatic не делает метод статическим в Kotlin - в Kotlin методы объектов и компаньонов и так вызываются статически. Она только генерирует дополнительный статический метод для JVM.

Методы, помеченные @JvmStatic, не могут быть абстрактными и должны иметь реализацию.

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

  • JvmField,
    аннотация для генерации полей вместо геттеров/сеттеров