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