В этом посте мы рассмотрим написание статических функций в 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”