Статические методы и переменные Котлина

Я хочу, чтобы сохранить экземпляр класса в общедоступную статическую переменную, но я не могу понять, как это сделать в Котлине.

class Foo {

    public static Foo instance;
    public Foo() {
        instance = this;
    }

}

Ответы

Ответ 1

Ближайшая вещь к статическим полям Java является сопутствующим объектом. Вы можете найти ссылку на документацию для них здесь: https://kotlinlang.org/docs/reference/object-declarations.html#companion-objects

Ваш код в Котлине будет выглядеть примерно так:

class Foo {

    companion object {
        lateinit var instance: Foo
    }

    init {
        instance = this
    }

}

Если вы хотите, чтобы ваши поля/методы отображались как статические вызовы Java, вы можете применить аннотацию @JvmStatic:

class Foo {

    companion object {
        @JvmStatic lateinit var instance: Foo
    }

    init {
        instance = this
    }

}

Ответ 2

Похоже, вы хотите определить одноэлементный объект. Он поддерживается в Котлине как первоклассная концепция:

object Foo {
  ... 
}

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

Из кода Котлина вы можете ссылаться на экземпляр этого объекта просто как Foo. Из кода Java вы можете ссылаться на экземпляр этого объекта как Foo.INSTANCE, потому что компилятор Kotlin автоматически создает соответствующее статическое поле с именем INSTANCE.

Ответ 3

сначала вы создаете простой класс, а затем создадите блок, за которым следует ключевое слово companion

например:

class Test{

    companion object{

        fun  getValue(): String{

           return "Test String"

        }
    }
}

вы можете вызвать эту функцию класса, используя имя имени точки имени точки

например:

// here you will get the function value
Test.getValue() 

Ответ 4

Вы можете создать сопутствующий объект для класса, и если вы действительно станете полем, вы можете использовать аннотацию @JvmStatic. Объект Companion имеет доступ к закрытым членам класса, для которого он является компаньоном.

Ниже приведен пример:

class User {
    private lateinit var name: String

    override fun toString() = name

    companion object {
        @JvmStatic
        val instance by lazy {
            User().apply { name = "jtonic" }
        }
    }
}

class CompanionTest {

    @Test
    fun `test companion object`() {
        User.instance.toString() shouldBe "jtonic"
    }
}