Что эквивалентно статическим методам Java в Котлине?

В Котлине нет ключевого слова static .

Каков наилучший способ представления static метода Java в Котлин?

Вы помещаете функцию в «объект-компаньон».

Таким образом, код java выглядит так:

 class Foo { public static int a() { return 1; } } 

станет

 class Foo { companion object { fun a() : Int = 1 } } 

Затем вы можете использовать его из кода Котлина в качестве

 Foo.a(); 

Но из кода Java вам нужно назвать это как

 Foo.Companion.a(); 

(Который также работает из Котлина).

Если вам не нужно указывать бит Companion вы можете либо добавить аннотацию @JvmStatic либо назвать свой сопутствующий класс.

Из документов :

Сопутствующие объекты

Объявление объекта внутри класса может быть помечено ключевым словом companion:

 class MyClass { companion object Factory { fun create(): MyClass = MyClass() } } 

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

 val instance = MyClass.create() 

Однако на JVM вы можете иметь членов сопутствующих объектов, сгенерированных как реальные статические методы и поля, если вы используете аннотацию @JvmStatic . Подробнее см. Раздел «Интерфейс взаимодействия с Java».

Добавление аннотации @JvmStatic выглядит так:

 class Foo { companion object { @JvmStatic fun a() : Int = 1; } } 

а затем a будет существовать как реальная статическая функция Java, доступная как из java, так и kotlin как Foo.a() .

Если это просто неприязнь к имени Companion , то вы также можете указать явное имя для объекта-компаньона, как показано ниже:

 class Foo { companion object Blah { fun a() : Int = 1; } } 

который позволит вам вызвать его из Kotlin таким же образом, но из java, как Foo.Blah.a() (который также будет работать в Котлине).

Документы рекомендуют решать большинство потребностей в статических функциях с функциями уровня пакета . Они просто объявляются вне класса inn в файле исходного кода. Пакет файла можно указать в начале пакета с ключевым словом пакета.

декларация

 package foo fun bar() = {} 

Применение

 import foo.bar 

альтернативно

 import foo.* 

Теперь вы можете вызвать функцию с помощью:

 bar() 

или если вы не используете ключевое слово import:

 foo.bar() 

Если вы не укажете пакет, функция будет доступна из корня.

Если у вас есть только опыт работы с java, это может показаться немного странным. Причина в том, что котлин не является строго объектно-ориентированным языком. Можно сказать, что он поддерживает методы вне классов.

1. Определите :

Любой method/ val/ var внутри object (ключевое слово для Singleton ) будет действовать как static в java.

Используйте companion object если вы хотите вызвать метод, просто используя класс, содержащий объект.

 object Foo{ fun sayFoo() = println("Foo") val bar ="bar" } 

2. Использование:

 Foo.sayFoo() println(Foo.bar) 

3. Выход:

 Foo bar 

Используйте объект для представления val / var / method для статичности. Вы также можете использовать объект вместо Singleton. Вы можете использовать компаньон, если хотите сделать статичным внутри класса

 object Abc{ fun sum(a: Int, b: Int): Int = a + b } 

Вам нужно передать объект-компаньон для статического метода, потому что у kotlin нет статического ключевого слова. Члены сопутствующего объекта можно вызвать, просто используя имя класса в качестве определителя:

 package xxx class ClassName { companion object { fun helloWord(str: String): String { return stringValue } } } 

Напишите их непосредственно в файлы.

В Java (уродливый):

 package xxx; class XxxUtils { public static final Yyy xxx(Xxx xxx) { return xxx.xxx(); } } 

В Котлине:

 @file:JvmName("XxxUtils") package xxx fun xxx(xxx: Xxx): Yyy = xxx.xxx() 

Эти две части кодов равны после компиляции (даже скомпилированное имя файла, file:JvmName используется для управления скомпилированным именем файла, которое должно быть указано непосредственно перед объявлением имени пакета).

Используйте функцию внутри «объекта-компаньона или именованного объекта».

См. Пример сопутствующего объекта:

  class Foo { companion object { fun square(x : Int) : Int = x*x } } 

См. Пример именованного объекта

 object Foo{ fun square(x : Int) : Int = x*x } 

Вы можете получить доступ, используя

 val k = Foo.square(12)