Рубрики
Без рубрики

Дружественные к Java Kotlin – статические функции

В этом посте мы рассмотрим написание статических функций в Kotlin, которые обрабатывают вызывающие Java как… Помеченный как kotlin, java.

В этом посте мы рассмотрим написание статических функций в Kotlin, которые относятся к вызывающим Java как к первоклассным гражданам.

Резюмировать

Существует три способа определения статических функций в Kotlin:

  • Непосредственно в файле Kotlin:
fun execute() {
  println("Executing from inside a kotlin file")
}

Вызванный:

execute()
  • Внутри Сопутствующего объекта:
class StaticFunctions {
  companion object {
    fun execute() {
      println("Executing from inside a companion object")
    }
  }
}

Вызванный:

StaticFunctions.execute()
StaticFunctions.Companion.execute() // If you really wanted to...
  • Внутри статического объекта:
object StaticFunctions {
  fun execute() {
    println("Executing from inside a static object")
  }
}
Called by:
StaticFunctions.execute()

Недружественные статические функции

Функции, определенные выше, не являются дружественными . Вот как вы могли бы вызвать каждый из них из Java:

  • Непосредственно в файле Kotlin:
StaticFunctionsKt.execute();
  • Внутри Сопутствующего объекта:
StaticFunctions.Companion.execute();
  • Внутри статического объекта:
StaticFunctions.INSTANCE.execute();

Все они выглядят довольно плохо. Я бы использовал более вульгарные слова, если бы не писал…

  • Статические функции K t.execute не так уж плохи, они относительно близки к стандартной статической функции Java. За исключением того, что ясно, что он взят из файла/библиотеки Kotlin из-за Kt застрял на конце.

  • Статические Функции.Companion.execute намного хуже, так как вам приходится ссылаться непосредственно на объект Companion для доступа к функции. Кроме того, упоминание объекта Companion не вносит никакой дополнительной ясности в код, поэтому еще больше причин попытаться удалить его.

  • Статические Функции.INSTANCE.execute имеет ту же проблему, что и версия Companion .

Написание статических функций, удобных для Java

Каждый из трех способов определения статических функций в Kotlin может улучшить совместимость с Java с помощью различных маршрутов.

Имя JvmName

Аннотацию @file:Jvm Name можно добавить в начало файла Kotlin, чтобы вы могли вручную указать имя файла:

@file:JvmName("StaticFunctions")

package dev.lankydan

fun execute() {
  println("Executing from inside a kotlin file")
}

Это позволяет вызывать функцию из Java, используя указанное имя файла, а не исходное имя. Для файла можно выбрать любое имя, но в большинстве случаев достаточно присвоить ему то же имя, что и исходному файлу ( Kt часть отбрасывается с конца).

Затем это можно назвать таковым:

StaticFunctions.execute();

Jvm Статический

Аннотация @JvmStatic может быть добавлена к функциям, найденным в Companion и статических объектах:

  • Внутри Сопутствующего объекта:
class StaticFunctions {
  companion object {
    @JvmStatic
    fun execute() {
      println("Executing from inside a companion object")
    }
  }
}
  • Внутри статического объекта:
object StaticFunctions {
  @JvmStatic
  fun execute() {
    println("Executing from inside a static object")
  }
}

@JvmStatic генерирует новую версию функции, которая больше подходит для вызывающих Java.

Затем вы можете получить доступ к функции точно так же, как к любой обычной статической функции Java (как Companion , так и статические объекты могут вызываться одинаково).:

StaticFunctions.execute();

Какой из них вам следует использовать

На этот вопрос я все еще пытаюсь ответить сам.

В настоящее время я считаю, что если вы пишете чисто статическую функцию, вам следует добавить функцию непосредственно в файл (а не внутри Companion или статического объекта). Включение класса все усложняет.

С другой стороны, вы должны использовать Companion или статический объект, если вам необходимо выполнить следующие критерии:

  • На класс/объект должна быть прямая ссылка (например, передача экземпляра в другую функцию)
  • Предоставлять статические функции

Резюме

Используя аннотации @file:Jvm Name и @JvmStatic , вы можете писать статические функции Kotlin, которые можно использовать из Java приятным и удобным способом. Не имеет значения, как вы определяете свои статические функции, поскольку у вас есть методы, позволяющие улучшить их работу с Java.

Если вам понравился этот пост или вы сочли его полезным (или и то, и другое), пожалуйста, не стесняйтесь подписываться на меня в Twitter по адресу @LankyDanDev и не забудьте поделиться с кем-либо еще, кто может счесть это полезным!

Оригинал: “https://dev.to/lankydandev/java-friendly-kotlin-static-functions-pch”