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


619

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

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


8
Используйте функцию уровня пакета .
Феникс

13
Имейте в виду: Kotlin удалил статику в стиле Java, чтобы поощрять более поддерживаемые (смею сказать, «лучше») методы кодирования. Статические глобалы, как правило, против ООП-парадигмы, но они могут быть довольно удобными. Следовательно, Kotlin предоставил нам компаньонов, более удобный для ООП способ иметь статику.
Николас Миллер

По словам Google, сейчас Kotlin является предпочтительным языком для разработки под Android.
AFD

@NicholasMiller, почему он более ООП-дружественный? Я думаю, что легче читать и писать без повторяющихся примечаний статического (шаблон). Или есть другая веская причина?
Торбен G

Ответы:


889

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

Таким образом, код Java, как это:

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

станет

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

Затем вы можете использовать его внутри кода Kotlin как

Foo.a();

Но из Java-кода вам нужно будет назвать его как

Foo.Companion.a();

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

Если вам не нравится указывать 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;
  }
}

и тогда она будет существовать как настоящая статическая функция Java, доступная как из Java, так и из Kotlin Foo.a().

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

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

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


4
В Котлине это будет 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 не является строго объектно-ориентированным языком. Можно сказать, что он поддерживает методы вне классов.

Редактировать: они отредактировали документацию, чтобы больше не включать предложение о рекомендации функций уровня пакета. Это оригинал, о котором говорилось выше.


8
Обратите внимание, что под капотом эти функции «верхнего уровня» или «пакета» фактически скомпилированы в их собственный класс. В приведенном выше примере компилятор создаст объект class FooPackageсо всеми свойствами и функциями верхнего уровня и соответствующим образом направит все ваши ссылки на них. Больше информации от jetbrains.
Митчелл Трейси

29
+1 За объяснение, как сделать эквивалентное право в Kotlin, а не просто зеркальный эквивалент из Java.
Феникс

1
Это должен быть принятый ответ, или мод должен обновить принятый ответ, чтобы он содержал функции уровня пакета
Усама Шабрез

@MitchellTracy Отличная информация! Спасибо.
дроид

1
Пока это лучшее решение. Просто хотел уточнить, что, где вы определяете функцию, bar()не имеет значения имя файла, вы можете назвать его BarUtils.ktили как угодно, тогда как в тексте сказано, что вы импортируете его сimport <package name>.bar
Mariano Ruiz

33

А. Старый Путь Явы:

  1. Объявите companion objectдля включения статического метода / переменной

    class Foo{
    companion object {
        fun foo() = println("Foo")
        val bar ="bar"  
        }
    }
  2. Используйте:

    Foo.foo()        // Outputs Foo    
    println(Foo.bar) // Outputs bar


Б. Новый Котлинский путь

  1. Объявите непосредственно в файле без класса в .ktфайле.

    fun foo() = println("Foo")
    val bar ="bar"
  2. Используйте methods/variablesс их именами . ( После импорта их )

    Используйте:

    foo()        // Outputs Foo          
    println(bar) // Outputs bar     


Если я пытаюсь инициализировать в каком-то другом классе, это дает 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, чтобы сделать статичным. Вы также можете использовать объект вместо синглтон-класса. Вы можете использовать компаньон, если вы хотите сделать статические внутри класса

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

Если вам нужно вызвать его из Java:

int z = Abc.INSTANCE.sum(x,y);

В Котлине игнорируйте МОМЕНТ.


11

Это также сработало для меня

object Bell {
    @JvmStatic
    fun ring() { }
}

из Котлина

Bell.ring()

с Явы

Bell.ring()

8
object objectName {
    fun funName() {

    }
}

5
Хотя этот фрагмент кода может быть решением, включение пояснения действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин, по которым вы предлагаете код.
Нарендра Джадхав

5

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

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

4

Есть два способа применения статики в Котлине

Сначала создайте объект-компаньон в классе

Например:

class Test{
    companion object{
          fun isCheck(a:Int):Boolean{
             if(a==0) true else false
          }
     }
}

Вы можете вызвать эту функцию как

Test.Companion.isCheck(2)

Другой способ, которым мы можем воспользоваться, это сделать объектный класс

object Test{
       fun isCheck(a:Int):Boolean{
            if(a==0) true else false
       }
}

Удачного кодирования!


Для первого использования (то есть Test.Companion.isCheck(2)) IDE показывает предупреждения и сказать Companion reference is redundant. Это может быть уменьшено до, Test.isCheck(2)и уменьшенная форма более близка к эквиваленту Java.
ВСБ

3

У Kotlin нет статического ключевого слова. Вы использовали это для Java

 class AppHelper {
        public static int getAge() {
            return 30;
        }
    }

и для котлина

class AppHelper {
        companion object {
            fun getAge() : Int = 30
        }
    }

Призыв к Java

AppHelper.getAge();

Позвони в Котлин

AppHelper.Companion.getAge();

Я думаю, что это работает отлично.


3

Я хотел бы добавить что-то к ответам выше.

Да, вы можете определять функции в файлах исходного кода (вне класса). Но будет лучше, если вы определите статические функции внутри класса, используя Companion Object, потому что вы можете добавить больше статических функций, используя расширения Kotlin .

class MyClass {
    companion object { 
        //define static functions here
    } 
}

//Adding new static function
fun MyClass.Companion.newStaticFunction() {
    // ...
}

И вы можете вызвать определенную выше функцию, как и любую другую функцию внутри объекта Companion.


3

Несмотря на то, что ему уже более 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 Java
package com.frybits

class KotlinClass {
    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;

class JavaClass {

    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 Java
package com.frybits

class KotlinClass {

    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].
        @JvmField
        var 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 instead
        const 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
        @JvmStatic
        var cat: Int = 9
    }
}

Ява

package com.frybits;

class JavaClass {

    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 variable
const 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 functions
var foo = 1

//This lets us use direct access now
@JvmField
var 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;

class JavaClass {

    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 function
        KotlinUtils.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 like
        KotlinUtils.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 Java
package com.frybits

object KotlinClass { //No need for the 'class' keyword here.

    //Direct access to this variable
    const val foo: Int = 1

    //Tells Java this can be accessed directly from [KotlinClass]
    @JvmStatic
    var 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;

class JavaClass {

    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 annotations
        KotlinClass.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);
    }
}

3

Для краткости вы можете использовать «объект-компаньон», чтобы попасть в статический мир Kotlin, например:

  companion object {
    const val TAG = "tHomeFragment"
    fun newInstance() = HomeFragment()
}

и для создания постоянного поля используйте «const val», как в коде. но старайтесь избегать статических классов, так как это затрудняет юнит-тестирование с использованием Mockito !.


3

Точное преобразование статического метода Java в эквивалент Котлина будет выглядеть следующим образом. Например, здесь класс util имеет один статический метод, который был бы эквивалентен как в java, так и в kotlin. Использование @JvmStatic важно.

Java-код:

    class Util{
         public static String capitalize(String text){
         return text.toUpperCase();}
       }

Код Котлина:

    class Util {
        companion object {
            @JvmStatic
            fun capitalize(text:String): String {
                return text.toUpperCase()
            }
        }
    }

2

Просто вам нужно создать сопутствующий объект и поместить в него функцию

  class UtilClass {
        companion object {
  //        @JvmStatic
            fun repeatIt5Times(str: String): String = str.repeat(5)
        }
    }

Чтобы вызвать метод из класса kotlin:

class KotlinClass{
  fun main(args : Array<String>) { 
    UtilClass.repeatIt5Times("Hello")
  }
}

или используя импорт

import Packagename.UtilClass.Companion.repeatIt5Times
class KotlinClass{
  fun main(args : Array<String>) { 
     repeatIt5Times("Hello")
  }
}

Чтобы вызвать метод из класса Java:

 class JavaClass{
    public static void main(String [] args){
       UtilClass.Companion.repeatIt5Times("Hello");
    }
 }

или добавив аннотацию @JvmStatic к методу

class JavaClass{
   public static void main(String [] args){
     UtilClass.repeatIt5Times("Hello")
   }
}

или оба, добавив аннотацию @JvmStatic к методу и сделав статический импорт в Java

import static Packagename.UtilClass.repeatIt5Times
class JavaClass{
   public static void main(String [] args){
     repeatIt5Times("Hello")
   }
}

2

Для Java:

public class Constants {
public static final long MAX_CLICK_INTERVAL = 1000;}

Эквивалентный код Котлина:

object  Constants {
const val MAX_CLICK_INTERVAL: Long = 1000}

Так что для эквивалента Java статические методы - это объектный класс в Kotlin.


2

Для Android используется строка от одного действия до всего необходимого действия. Так же, как статические в Java

public final static String TEA_NAME = "TEA_NAME";

Эквивалентный подход в Котлине:

class MainActivity : AppCompatActivity() {
    companion object {
        const val TEA_NAME = "TEA_NAME"
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

Другой вид деятельности, где необходимо значение:

val teaName = MainActivity.TEA_NAME

2

кроме ответа Майкла Андерсона, у меня есть код с двумя другими способами в моем проекте.

Первый:

Вы можете перевести все переменные в один класс. создал файл kotlin с именем Const

object Const {
    const val FIRST_NAME_1 = "just"
    const val LAST_NAME_1 = "YuMu"
}

Вы можете использовать его в кодлин и кодлин Java

 Log.d("stackoverflow", Const.FIRST_NAME_1)

Во-вторых:

Вы можете использовать функцию расширения Kotlin,
создав файл Kotlin с именем Ext , ниже код весь код в файле Ext

package pro.just.yumu

/**
 * Created by lpf on 2020-03-18.
 */

const val FIRST_NAME = "just"
const val LAST_NAME = "YuMu"

Вы можете использовать его в коде kotlin

 Log.d("stackoverflow", FIRST_NAME)

Вы можете использовать его в коде Java

 Log.d("stackoverflow", ExtKt.FIRST_NAME);

1

Запишите их прямо в файлы.

На Яве (некрасиво):

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используется для управления именем скомпилированного файла, которое следует поместить непосредственно перед объявлением имени пакета).


7
Вы забыли "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)
                }
            }
}

1

Пусть у вас есть ученик класса . И у вас есть один статический метод getUniversityName () и одно статическое поле с именем totalStudent .

Вы должны объявить блок сопутствующего объекта внутри вашего класса.

companion object {
 // define static method & field here.
}

Тогда ваш класс выглядит

    class Student(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 field
        var totalStudent = 30
    }
}

Затем вы можете использовать эти статические методы и поля, как этот способ.

println("University : " + Student.getUniversityName() + ", Total Student: " + Student.totalStudent)
    // Output:
    // University : MBSTU, Total Student: 30

1

В kotlin нет статического ключевого слова. kotlin docs рекомендует использовать функции уровня пакета, если вы хотите следовать DRY. Создайте файл с расширением .kt и поместите в него свой метод.

package p
    fun m(){
    //fun body
    }

после компиляции m будет иметь подпись public static final void

а также

import p.m


0

Вы можете достичь статической функциональности в Kotlin с помощью Companion Objects

  • Добавление компаньона к объявлению объекта позволяет добавить статические функциональные возможности к объекту, даже если в Kotlin не существует действительной статической концепции.
  • Объект компаньона может получить доступ ко всем членам класса тоже, в том числе частных застройщиков.
  • Объект компаньона инициализируется при создании экземпляра класса.
  • Объект спутник не может быть объявлен вне класса.

    class MyClass{
    
        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 Decleration

MyClass.getStaticFunction() : // This is an example of static function for Object Decleration

0

Весь статический член и функция должны быть внутри сопутствующего блока

  companion object {
    @JvmStatic
    fun main(args: Array<String>) {
    }

    fun staticMethod() {
    }
  }

0

Многие люди упоминают сопутствующие объекты, и это правильно. Но, как вы знаете, вы также можете использовать любой объект (используя ключевое слово object, а не class), т.е.

object StringUtils {
    fun toUpper(s: String) : String { ... }
}

Используйте его так же, как любой статический метод в Java:

StringUtils.toUpper("foobar")

Подобный шаблон бесполезен в Kotlin, однако, одна из его сильных сторон заключается в том, что он избавляется от необходимости в классах, заполненных статическими методами. Вместо этого более целесообразно использовать глобальные, расширенные и / или локальные функции, в зависимости от вашего варианта использования. Там, где я работаю, мы часто определяем глобальные функции расширения в отдельном плоском файле с соглашением об именах: [className] Extensions.kt, т.е. FooExtensions.kt. Но чаще мы пишем функции там, где они нужны, внутри их рабочего класса или объекта.


0

В Java мы можем написать ниже

class MyClass {
  public static int myMethod() { 
  return 1;
  }
}

В Kotlin мы можем написать ниже

class MyClass {
  companion object {
     fun myMethod() : Int = 1
  }
}

спутник используется в качестве статического в Kotlin.


0

Поставщик документов kotlin может сделать это тремя способами. Первый - определить функцию в пакете без класса:

package com.example

fun f() = 1

вторая - использовать аннотацию @JvmStatic:

package com.example

class A{
@JvmStatic
fun f() = 1
}

и третий - использование объекта-компаньона:

package com.example

clss A{
companion object{
fun f() = 1
}
}

-1

Если вам требуется привязать функцию или свойство к классу, а не к его экземплярам, ​​вы можете объявить его внутри объекта-компаньона:

class Car(val horsepowers: Int) {
    companion object Factory {
        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)

Похоже, принятый ответ уже описывает сопутствующие объекты. Так много других ответов. Ваш ответ дает что-то новое?
Sneftel

для дальнейших разъяснений вы можете проверить его здесь kotlinlang.org/docs/tutorials/kotlin-for-py/...
асад Махмудом

-2

Вы можете использовать Companion Objects - kotlinlang

Что это может быть показано, сначала создав этот интерфейс

interface I<T> {

}

Затем мы должны сделать функцию внутри этого интерфейса:

fun SomeFunc(): T

Тогда после, нам нужен класс:

class SomeClass {}

внутри этого класса нам нужен сопутствующий объект внутри этого класса:

companion object : I<SomeClass> {}

внутри этого объекта-компаньона нам нужна эта старая SomeFuncфункция, но нам нужно перегрузить ее:

override fun SomeFunc(): SomeClass = SomeClass()

Наконец, ниже всей этой работы, нам нужно что-то для питания этой статической функции, нам нужна переменная:

var e:I<SomeClass> = SomeClass()
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.