Имейте в виду: Kotlin удалил статику в стиле Java, чтобы поощрять более поддерживаемые (смею сказать, «лучше») методы кодирования. Статические глобалы, как правило, против ООП-парадигмы, но они могут быть довольно удобными. Следовательно, Kotlin предоставил нам компаньонов, более удобный для ООП способ иметь статику.
Николас Миллер
По словам Google, сейчас Kotlin является предпочтительным языком для разработки под Android.
AFD
@NicholasMiller, почему он более ООП-дружественный? Я думаю, что легче читать и писать без повторяющихся примечаний статического (шаблон). Или есть другая веская причина?
Торбен G
Ответы:
889
Вы помещаете функцию в «объект-компаньон».
Таким образом, код Java, как это:
classFoo{publicstaticint a(){return1;}}
станет
classFoo{
companion object{
fun a():Int=1}}
Затем вы можете использовать его внутри кода Kotlin как
Foo.a();
Но из Java-кода вам нужно будет назвать его как
Foo.Companion.a();
(Который также работает изнутри Kotlin.)
Если вам не нравится указывать Companionбит, вы можете добавить @JvmStaticаннотацию или назвать свой класс-компаньон.
Объявление объекта внутри класса может быть помечено ключевым словом companion:
classMyClass{
companion objectFactory{
fun create():MyClass=MyClass()}}
Члены объекта-компаньона можно вызывать, используя просто имя класса в качестве квалификатора:
val instance =MyClass.create()
...
Однако в JVM вы можете создавать элементы сопутствующих объектов, сгенерированные как реальные статические методы и поля, если вы используете @JvmStatic
аннотацию. Посмотрите раздел о совместимости Java для более подробной информации.
Добавление @JvmStaticаннотации выглядит так
classFoo{
companion object{@JvmStatic
fun a():Int=1;}}
и тогда она будет существовать как настоящая статическая функция Java, доступная как из Java, так и из Kotlin Foo.a().
Если оно просто не нравится Companionимени, то вы также можете предоставить явное имя для объекта-компаньона, которое выглядит следующим образом:
classFoo{
companion objectBlah{
fun a():Int=1;}}
что позволит вам вызывать его из Kotlin таким же образом, но из java как Foo.Blah.a()(что также будет работать в Kotlin).
В Котлине это будет fun a(): Int { return 1 }или дажеfun a(): Int = 1
Дмитрий Зайцев
3
@DmitryZaitsev или даже fun a() = 1.
Мойра
Что такое Фабрика?
Bagus Aji Santoso
@BagusAjiSantoso Factory- это имя объекта-компаньона, но для чего это можно использовать? Понятия не имею, но мне было интересно, поэтому я создал вопрос, посвященный этому: stackoverflow.com/q/45853459/221955 .
Майкл Андерсон
1
@ Yajairo87 Я думаю, что то, что вы спрашиваете, слишком много, чтобы упомянуть здесь, в комментариях - поэтому я создал вопрос, обращаясь к нему напрямую: stackoverflow.com/questions/47046474/…
Майкл Андерсон
154
Docs рекомендует решить большинство потребностей статических функций с помощью функций уровня пакета . Они просто объявляются вне класса в файле исходного кода. Пакет файла может быть указан в начале файла с ключевым словом пакета.
декларация
package foo
fun bar()={}
Применение
import foo.bar
альтернативно
import foo.*
Теперь вы можете вызвать функцию с помощью:
bar()
или если вы не используете ключевое слово import:
foo.bar()
Если вы не укажете пакет, функция будет доступна из корня.
Если у вас есть только опыт работы с Java, это может показаться немного странным. Причина в том, что kotlin не является строго объектно-ориентированным языком. Можно сказать, что он поддерживает методы вне классов.
Редактировать: они отредактировали документацию, чтобы больше не включать предложение о рекомендации функций уровня пакета. Это оригинал, о котором говорилось выше.
Обратите внимание, что под капотом эти функции «верхнего уровня» или «пакета» фактически скомпилированы в их собственный класс. В приведенном выше примере компилятор создаст объект class FooPackageсо всеми свойствами и функциями верхнего уровня и соответствующим образом направит все ваши ссылки на них. Больше информации от jetbrains.
Митчелл Трейси
29
+1 За объяснение, как сделать эквивалентное право в Kotlin, а не просто зеркальный эквивалент из Java.
Феникс
1
Это должен быть принятый ответ, или мод должен обновить принятый ответ, чтобы он содержал функции уровня пакета
Усама Шабрез
@MitchellTracy Отличная информация! Спасибо.
дроид
1
Пока это лучшее решение. Просто хотел уточнить, что, где вы определяете функцию, bar()не имеет значения имя файла, вы можете назвать его BarUtils.ktили как угодно, тогда как в тексте сказано, что вы импортируете его сimport <package name>.bar
Mariano Ruiz
33
А. Старый Путь Явы:
Объявите companion objectдля включения статического метода / переменной
classFoo{
companion object{
fun foo()= println("Foo")
val bar ="bar"}}
Используйте:
Foo.foo()// Outputs Foo
println(Foo.bar)// Outputs bar
Б. Новый Котлинский путь
Объявите непосредственно в файле без класса в .ktфайле.
fun foo()= println("Foo")
val bar ="bar"
Используйте methods/variablesс их именами . ( После импорта их )
Если я пытаюсь инициализировать в каком-то другом классе, это дает java.lang.ExceptionInInitializerError, и я использую var вместо val
Sudarshan
4
У вызовов методов должно быть INSTANCEключевое слово, например:Foo.INSTANCE.sayFoo()
Raeglan
Я думаю, что это решение является предпочтительным способом, если вы хотите static CLASSне просто static methdos. Потому что с сопутствующими объектами вы все еще можете создать экземпляр родительского класса.
fabriciorissetto
valне является статичным, это эквивалентно static finalв Java
Фарид
23
Используйте объект для представления val / var / method, чтобы сделать статичным. Вы также можете использовать объект вместо синглтон-класса. Вы можете использовать компаньон, если вы хотите сделать статические внутри класса
Хотя этот фрагмент кода может быть решением, включение пояснения действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин, по которым вы предлагаете код.
Нарендра Джадхав
5
Вам необходимо передать сопутствующий объект для статического метода, потому что kotlin не имеет статического ключевого слова. Члены этого сопутствующего объекта можно вызвать, используя просто имя класса в качестве квалификатора:
package xxx
classClassName{
companion object{
fun helloWord(str:String):String{return stringValue
}}}
Для первого использования (то есть Test.Companion.isCheck(2)) IDE показывает предупреждения и сказать Companion reference is redundant. Это может быть уменьшено до, Test.isCheck(2)и уменьшенная форма более близка к эквиваленту Java.
ВСБ
3
У Kotlin нет статического ключевого слова. Вы использовали это для Java
Да, вы можете определять функции в файлах исходного кода (вне класса). Но будет лучше, если вы определите статические функции внутри класса, используя Companion Object, потому что вы можете добавить больше статических функций, используя расширения Kotlin .
classMyClass{
companion object{//define static functions here}}//Adding new static function
fun MyClass.Companion.newStaticFunction(){// ...}
И вы можете вызвать определенную выше функцию, как и любую другую функцию внутри объекта Companion.
Несмотря на то, что ему уже более 2 лет, и у него было много отличных ответов, я вижу, что отсутствуют некоторые другие способы получения «статических» полей Котлина. Вот пример руководства по staticвзаимодействию Kotlin-Java :
Сценарий 1. Создание статического метода в Kotlin для Java
Котлин
@file:JvmName("KotlinClass")//This provides a name for this file, so it's not defaulted as [KotlinClassKt] in Javapackage com.frybits
classKotlinClass{
companion object{//This annotation tells Java classes to treat this method as if it was a static to [KotlinClass]@JvmStatic
fun foo():Int=1//Without it, you would have to use [KotlinClass.Companion.bar()] to use this method.
fun bar():Int=2}}
Ява
package com.frybits;classJavaClass{void someFunction(){
println(KotlinClass.foo());//Prints "1"
println(KotlinClass.Companion.bar());//Prints "2". This is the only way to use [bar()] in Java.
println(KotlinClass.Companion.foo());//To show that [Companion] is still the holder of the function [foo()]}//Because I'm way to lazy to keep typing [System.out], but I still want this to be compilable.void println(Object o){System.out.println(o);}}
Ответ Майкла Андерсона дает больше глубины, чем это, и на него обязательно следует ссылаться для этого сценария.
Этот следующий сценарий обрабатывает создание статических полей в Kotlin, так что Java не нужно постоянно вызывать KotlinClass.foo()в тех случаях, когда вам не нужна статическая функция.
Сценарий 2. Создание статической переменной в Kotlin для Java
Котлин
@file:JvmName("KotlinClass")//This provides a name for this file, so it's not defaulted as [KotlinClassKt] in Javapackage com.frybits
classKotlinClass{
companion object{//This annotation tells Kotlin to not generate the getter/setter functions in Java. Instead, this variable should be accessed directly//Also, this is similar to [@JvmStatic], in which it tells Java to treat this as a static variable to [KotlinClass].@JvmFieldvar foo:Int=1//If you want something akin to [final static], and the value is a primitive or a String, you can use the keyword [const] instead//No annotation is needed to make this a field of [KotlinClass]. If the declaration is a non-primitive/non-String, use @JvmField insteadconst val dog:Int=1//This will be treated as a member of the [Companion] object only. It generates the getter/setters for it.var bar:Int=2//We can still use [@JvmStatic] for 'var' variables, but it generates getter/setters as functions of KotlinClass//If we use 'val' instead, it only generates a getter function@JvmStaticvar cat:Int=9}}
Ява
package com.frybits;classJavaClass{void someFunction(){//Example using @JvmField
println(KotlinClass.foo);//Prints "1"KotlinClass.foo =3;//Example using 'const val'
println(KotlinClass.dog);//Prints "1". Notice the lack of a getter function//Example of not using either @JvmField, @JvmStatic, or 'const val'
println(KotlinClass.Companion.getBar());//Prints "2"KotlinClass.Companion.setBar(3);//The setter for [bar]//Example of using @JvmStatic instead of @JvmField
println(KotlinClass.getCat());KotlinClass.setCat(0);}void println(Object o){System.out.println(o);}}
Одной из замечательных особенностей Kotlin является то, что вы можете создавать функции и переменные верхнего уровня. Это позволяет создавать «бесклассовые» списки константных полей и функций, которые, в свою очередь, могут использоваться как staticфункции / поля в Java.
Сценарий 3: Доступ к полям и функциям верхнего уровня в Kotlin из Java
Котлин
//In this example, the file name is "KSample.kt". If this annotation wasn't provided, all functions and fields would have to accessed//using the name [KSampleKt.foo()] to utilize them in Java. Make life easier for yourself, and name this something more simple@file:JvmName("KotlinUtils")package com.frybits
//This can be called from Java as [KotlinUtils.TAG]. This is a final static variableconst val TAG ="You're it!"//Since this is a top level variable and not part of a companion object, there's no need to annotate this as "static" to access in Java.//However, this can only be utilized using getter/setter functionsvar foo =1//This lets us use direct access now@JvmFieldvar bar =2//Since this is calculated at runtime, it can't be a constant, but it is still a final static variable. Can't use "const" here.
val GENERATED_VAL:Long="123".toLong()//Again, no need for @JvmStatic, since this is not part of a companion object
fun doSomethingAwesome(){
println("Everything is awesome!")}
Ява
package com.frybits;classJavaClass{void someFunction(){
println(KotlinUtils.TAG);//Example of printing [TAG]//Example of not using @JvmField.
println(KotlinUtils.getFoo());//Prints "1"KotlinUtils.setFoo(3);//Example using @JvmField
println(KotlinUtils.bar);//Prints "2". Notice the lack of a getter functionKotlinUtils.bar =3;//Since this is a top level variable, no need for annotations to use this//But it looks awkward without the @JvmField
println(KotlinUtils.getGENERATED_VAL());//This is how accessing a top level function looks likeKotlinUtils.doSomethingAwesome();}void println(Object o){System.out.println(o);}}
Еще одно заметное упоминание, которое можно использовать в Java в качестве «статических» полей, - это objectклассы Kotlin . Это одноэлементные классы с нулевым параметром, которые лениво создаются при первом использовании. Более подробную информацию о них можно найти здесь: https://kotlinlang.org/docs/reference/object-declarations.html#object-declarations
Однако для доступа к синглтону создается специальный INSTANCEобъект, с которым так же сложно работать, как и Companionраньше. Вот как использовать аннотации для придания этому staticJava ясности:
Сценарий 4. Использование objectклассов
Котлин
@file:JvmName("KotlinClass")//This provides a name for this file, so it's not defaulted as [KotlinClassKt] in Javapackage com.frybits
objectKotlinClass{//No need for the 'class' keyword here.//Direct access to this variableconst val foo:Int=1//Tells Java this can be accessed directly from [KotlinClass]@JvmStaticvar cat:Int=9//Just a function that returns the class name@JvmStatic
fun getCustomClassName():String=this::class.java.simpleName +"boo!"//Getter/Setter access to this variable, but isn't accessible directly from [KotlinClass]var bar:Int=2
fun someOtherFunction()="What is 'INSTANCE'?"}
Ява
package com.frybits;classJavaClass{void someFunction(){
println(KotlinClass.foo);//Direct read of [foo] in [KotlinClass] singleton
println(KotlinClass.getCat());//Getter of [cat]KotlinClass.setCat(0);//Setter of [cat]
println(KotlinClass.getCustomClassName());//Example of using a function of this 'object' class
println(KotlinClass.INSTANCE.getBar());//This is what the singleton would look like without using annotationsKotlinClass.INSTANCE.setBar(23);
println(KotlinClass.INSTANCE.someOtherFunction());//Accessing a function in the object class without using annotations}void println(Object o){System.out.println(o);}}
Для краткости вы можете использовать «объект-компаньон», чтобы попасть в статический мир Kotlin, например:
companion object{const val TAG ="tHomeFragment"
fun newInstance()=HomeFragment()}
и для создания постоянного поля используйте «const val», как в коде. но старайтесь избегать статических классов, так как это затрудняет юнит-тестирование с использованием Mockito !.
Точное преобразование статического метода Java в эквивалент Котлина будет выглядеть следующим образом. Например, здесь класс util имеет один статический метод, который был бы эквивалентен как в java, так и в kotlin. Использование @JvmStatic важно.
Для Android используется строка от одного действия до всего необходимого действия. Так же, как статические в Java
public final static String TEA_NAME = "TEA_NAME";
Эквивалентный подход в Котлине:
classMainActivity:AppCompatActivity(){
companion object{const val TEA_NAME ="TEA_NAME"}override fun onCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)}}
@file:JvmName("XxxUtils")package xxx
fun xxx(xxx:Xxx):Yyy= xxx.xxx()
Эти две части кода сравниваются после компиляции (даже имя скомпилированного файла, file:JvmNameиспользуется для управления именем скомпилированного файла, которое следует поместить непосредственно перед объявлением имени пакета).
Вы забыли "Kotlin (некрасиво)" ... KOTLIN: сопутствующий объект {val handler = object: Handler (Looper.getMainLooper ()) {] ..... JAVA: статический обработчик обработчика = новый обработчик (Looper.getMainLooper () ) {};
CmosBattery
1
Использовать @JVMStaticаннотацию
companion object{// TODO: Rename and change types and number of parameters@JvmStatic
fun newInstance(param1:String, param2:String)=EditProfileFragment().apply {
arguments =Bundle().apply {
putString(ARG_PARAM1, param1)
putString(ARG_PARAM2, param2)}}}
Пусть у вас есть ученик класса . И у вас есть один статический метод getUniversityName () и одно статическое поле с именем totalStudent .
Вы должны объявить блок сопутствующего объекта внутри вашего класса.
companion object{// define static method & field here.}
Тогда ваш класс выглядит
classStudent(var name:String,var city:String,var rollNumber:Double=0.0){// use companion object structure
companion object{// below method will work as static method
fun getUniversityName():String="MBSTU"// below field will work as static fieldvar totalStudent =30}}
Затем вы можете использовать эти статические методы и поля, как этот способ.
println("University : "+Student.getUniversityName()+", Total Student: "+Student.totalStudent)// Output:// University : MBSTU, Total Student: 30
В kotlin нет статического ключевого слова. kotlin docs рекомендует использовать функции уровня пакета, если вы хотите следовать DRY. Создайте файл с расширением .kt и поместите в него свой метод.
package p
fun m(){//fun body}
после компиляции m будет иметь подпись public static final void
Вы можете достичь статической функциональности в Kotlin с помощью Companion Objects
Добавление компаньона к объявлению объекта позволяет добавить
статические функциональные возможности к объекту, даже если в Kotlin не существует действительной статической концепции.
Объект компаньона может получить доступ ко всем членам класса тоже, в том числе частных застройщиков.
Объект компаньона инициализируется при создании экземпляра класса.
Объект спутник не может быть объявлен вне класса.
classMyClass{
companion object{
val staticField ="This is an example of static field Object Decleration"
fun getStaticFunction():String{return"This is example of static function for Object Decleration"}}}
Члены объекта-компаньона можно вызывать, используя просто имя класса в качестве квалификатора:
Вывод:
MyClass.staticField // This is an example of static field Object DeclerationMyClass.getStaticFunction():// This is an example of static function for Object Decleration
Многие люди упоминают сопутствующие объекты, и это правильно. Но, как вы знаете, вы также можете использовать любой объект (используя ключевое слово object, а не class), т.е.
objectStringUtils{
fun toUpper(s:String):String{...}}
Используйте его так же, как любой статический метод в Java:
StringUtils.toUpper("foobar")
Подобный шаблон бесполезен в Kotlin, однако, одна из его сильных сторон заключается в том, что он избавляется от необходимости в классах, заполненных статическими методами. Вместо этого более целесообразно использовать глобальные, расширенные и / или локальные функции, в зависимости от вашего варианта использования. Там, где я работаю, мы часто определяем глобальные функции расширения в отдельном плоском файле с соглашением об именах: [className] Extensions.kt, т.е. FooExtensions.kt. Но чаще мы пишем функции там, где они нужны, внутри их рабочего класса или объекта.
Если вам требуется привязать функцию или свойство к классу, а не к его экземплярам, вы можете объявить его внутри объекта-компаньона:
classCar(val horsepowers:Int){
companion objectFactory{
val cars = mutableListOf<Car>()
fun makeCar(horsepowers:Int):Car{
val car =Car(horsepowers)
cars.add(car)return car
}}}
Сопутствующий объект является одиночным, и к его членам можно получить доступ напрямую через имя содержащего класса.
val car =Car.makeCar(150)
println(Car.Factory.cars.size)
Ответы:
Вы помещаете функцию в «объект-компаньон».
Таким образом, код Java, как это:
станет
Затем вы можете использовать его внутри кода Kotlin как
Но из Java-кода вам нужно будет назвать его как
(Который также работает изнутри Kotlin.)
Если вам не нравится указывать
Companion
бит, вы можете добавить@JvmStatic
аннотацию или назвать свой класс-компаньон.Из документов :
Добавление
@JvmStatic
аннотации выглядит таки тогда она будет существовать как настоящая статическая функция Java, доступная как из Java, так и из Kotlin
Foo.a()
.Если оно просто не нравится
Companion
имени, то вы также можете предоставить явное имя для объекта-компаньона, которое выглядит следующим образом:что позволит вам вызывать его из Kotlin таким же образом, но из java как
Foo.Blah.a()
(что также будет работать в Kotlin).источник
fun a(): Int { return 1 }
или дажеfun a(): Int = 1
fun a() = 1
.Factory
- это имя объекта-компаньона, но для чего это можно использовать? Понятия не имею, но мне было интересно, поэтому я создал вопрос, посвященный этому: stackoverflow.com/q/45853459/221955 .Docs рекомендует решить большинство потребностей статических функций с помощью функций уровня пакета . Они просто объявляются вне класса в файле исходного кода. Пакет файла может быть указан в начале файла с ключевым словом пакета.
декларация
Применение
альтернативно
Теперь вы можете вызвать функцию с помощью:
или если вы не используете ключевое слово import:
Если вы не укажете пакет, функция будет доступна из корня.
Если у вас есть только опыт работы с Java, это может показаться немного странным. Причина в том, что kotlin не является строго объектно-ориентированным языком. Можно сказать, что он поддерживает методы вне классов.
Редактировать: они отредактировали документацию, чтобы больше не включать предложение о рекомендации функций уровня пакета. Это оригинал, о котором говорилось выше.
источник
class FooPackage
со всеми свойствами и функциями верхнего уровня и соответствующим образом направит все ваши ссылки на них. Больше информации от jetbrains.bar()
не имеет значения имя файла, вы можете назвать егоBarUtils.kt
или как угодно, тогда как в тексте сказано, что вы импортируете его сimport <package name>.bar
А. Старый Путь Явы:
Объявите
companion object
для включения статического метода / переменнойИспользуйте:
Б. Новый Котлинский путь
Объявите непосредственно в файле без класса в
.kt
файле.Используйте
methods/variables
с их именами . ( После импорта их )Используйте:
источник
INSTANCE
ключевое слово, например:Foo.INSTANCE.sayFoo()
static CLASS
не простоstatic methdos
. Потому что с сопутствующими объектами вы все еще можете создать экземпляр родительского класса.val
не является статичным, это эквивалентноstatic final
в JavaИспользуйте объект для представления val / var / method, чтобы сделать статичным. Вы также можете использовать объект вместо синглтон-класса. Вы можете использовать компаньон, если вы хотите сделать статические внутри класса
Если вам нужно вызвать его из Java:
В Котлине игнорируйте МОМЕНТ.
источник
Это также сработало для меня
из Котлина
с Явы
источник
источник
Вам необходимо передать сопутствующий объект для статического метода, потому что kotlin не имеет статического ключевого слова. Члены этого сопутствующего объекта можно вызвать, используя просто имя класса в качестве квалификатора:
источник
Есть два способа применения статики в Котлине
Сначала создайте объект-компаньон в классе
Например:
Вы можете вызвать эту функцию как
Другой способ, которым мы можем воспользоваться, это сделать объектный класс
Удачного кодирования!
источник
Test.Companion.isCheck(2)
) IDE показывает предупреждения и сказатьCompanion reference is redundant
. Это может быть уменьшено до,Test.isCheck(2)
и уменьшенная форма более близка к эквиваленту Java.У Kotlin нет статического ключевого слова. Вы использовали это для Java
и для котлина
Призыв к Java
Позвони в Котлин
Я думаю, что это работает отлично.
источник
Я хотел бы добавить что-то к ответам выше.
Да, вы можете определять функции в файлах исходного кода (вне класса). Но будет лучше, если вы определите статические функции внутри класса, используя Companion Object, потому что вы можете добавить больше статических функций, используя расширения Kotlin .
И вы можете вызвать определенную выше функцию, как и любую другую функцию внутри объекта Companion.
источник
Несмотря на то, что ему уже более 2 лет, и у него было много отличных ответов, я вижу, что отсутствуют некоторые другие способы получения «статических» полей Котлина. Вот пример руководства по
static
взаимодействию Kotlin-Java :Ответ Майкла Андерсона дает больше глубины, чем это, и на него обязательно следует ссылаться для этого сценария.
Этот следующий сценарий обрабатывает создание статических полей в Kotlin, так что Java не нужно постоянно вызывать
KotlinClass.foo()
в тех случаях, когда вам не нужна статическая функция.Одной из замечательных особенностей Kotlin является то, что вы можете создавать функции и переменные верхнего уровня. Это позволяет создавать «бесклассовые» списки константных полей и функций, которые, в свою очередь, могут использоваться как
static
функции / поля в Java.Еще одно заметное упоминание, которое можно использовать в Java в качестве «статических» полей, - это
object
классы Kotlin . Это одноэлементные классы с нулевым параметром, которые лениво создаются при первом использовании. Более подробную информацию о них можно найти здесь: https://kotlinlang.org/docs/reference/object-declarations.html#object-declarationsОднако для доступа к синглтону создается специальный
INSTANCE
объект, с которым так же сложно работать, как иCompanion
раньше. Вот как использовать аннотации для придания этомуstatic
Java ясности:источник
Для краткости вы можете использовать «объект-компаньон», чтобы попасть в статический мир Kotlin, например:
и для создания постоянного поля используйте «const val», как в коде. но старайтесь избегать статических классов, так как это затрудняет юнит-тестирование с использованием Mockito !.
источник
Точное преобразование статического метода Java в эквивалент Котлина будет выглядеть следующим образом. Например, здесь класс util имеет один статический метод, который был бы эквивалентен как в java, так и в kotlin. Использование @JvmStatic важно.
Java-код:
Код Котлина:
источник
Просто вам нужно создать сопутствующий объект и поместить в него функцию
Чтобы вызвать метод из класса kotlin:
или используя импорт
Чтобы вызвать метод из класса Java:
или добавив аннотацию @JvmStatic к методу
или оба, добавив аннотацию @JvmStatic к методу и сделав статический импорт в Java
источник
Для Java:
Эквивалентный код Котлина:
Так что для эквивалента Java статические методы - это объектный класс в Kotlin.
источник
Для Android используется строка от одного действия до всего необходимого действия. Так же, как статические в Java
public final static String TEA_NAME = "TEA_NAME";
Эквивалентный подход в Котлине:
Другой вид деятельности, где необходимо значение:
источник
кроме ответа Майкла Андерсона, у меня есть код с двумя другими способами в моем проекте.
Первый:
Вы можете перевести все переменные в один класс. создал файл kotlin с именем Const
Вы можете использовать его в кодлин и кодлин Java
Во-вторых:
Вы можете использовать функцию расширения Kotlin,
создав файл Kotlin с именем Ext , ниже код весь код в файле Ext
Вы можете использовать его в коде kotlin
Вы можете использовать его в коде Java
источник
Запишите их прямо в файлы.
На Яве (некрасиво):
В Котлине:
Эти две части кода сравниваются после компиляции (даже имя скомпилированного файла,
file:JvmName
используется для управления именем скомпилированного файла, которое следует поместить непосредственно перед объявлением имени пакета).источник
Использовать
@JVMStatic
аннотациюисточник
Пусть у вас есть ученик класса . И у вас есть один статический метод getUniversityName () и одно статическое поле с именем totalStudent .
Вы должны объявить блок сопутствующего объекта внутри вашего класса.
Тогда ваш класс выглядит
Затем вы можете использовать эти статические методы и поля, как этот способ.
источник
В kotlin нет статического ключевого слова. kotlin docs рекомендует использовать функции уровня пакета, если вы хотите следовать DRY. Создайте файл с расширением .kt и поместите в него свой метод.
после компиляции m будет иметь подпись public static final void
а также
☺
источник
Вы можете достичь статической функциональности в Kotlin с помощью Companion Objects
Объект спутник не может быть объявлен вне класса.
Члены объекта-компаньона можно вызывать, используя просто имя класса в качестве квалификатора:
Вывод:
источник
Весь статический член и функция должны быть внутри сопутствующего блока
источник
Многие люди упоминают сопутствующие объекты, и это правильно. Но, как вы знаете, вы также можете использовать любой объект (используя ключевое слово object, а не class), т.е.
Используйте его так же, как любой статический метод в Java:
Подобный шаблон бесполезен в Kotlin, однако, одна из его сильных сторон заключается в том, что он избавляется от необходимости в классах, заполненных статическими методами. Вместо этого более целесообразно использовать глобальные, расширенные и / или локальные функции, в зависимости от вашего варианта использования. Там, где я работаю, мы часто определяем глобальные функции расширения в отдельном плоском файле с соглашением об именах: [className] Extensions.kt, т.е. FooExtensions.kt. Но чаще мы пишем функции там, где они нужны, внутри их рабочего класса или объекта.
источник
В Java мы можем написать ниже
В Kotlin мы можем написать ниже
спутник используется в качестве статического в Kotlin.
источник
Поставщик документов kotlin может сделать это тремя способами. Первый - определить функцию в пакете без класса:
вторая - использовать аннотацию @JvmStatic:
и третий - использование объекта-компаньона:
источник
Если вам требуется привязать функцию или свойство к классу, а не к его экземплярам, вы можете объявить его внутри объекта-компаньона:
Сопутствующий объект является одиночным, и к его членам можно получить доступ напрямую через имя содержащего класса.
источник
Вы можете использовать Companion Objects - kotlinlang
Что это может быть показано, сначала создав этот интерфейс
Затем мы должны сделать функцию внутри этого интерфейса:
Тогда после, нам нужен класс:
внутри этого класса нам нужен сопутствующий объект внутри этого класса:
внутри этого объекта-компаньона нам нужна эта старая
SomeFunc
функция, но нам нужно перегрузить ее:Наконец, ниже всей этой работы, нам нужно что-то для питания этой статической функции, нам нужна переменная:
источник