web-dev-qa-db-fra.com

Méthodes et variables statiques de Kotlin

Je veux pouvoir enregistrer une instance de classe dans une variable statique publique, mais je ne vois pas comment faire cela avec Kotlin.

class Foo {

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

}
45
Caleb Bassham

La chose la plus proche des champs statiques de Java est un objet compagnon. Vous pouvez trouver la référence de la documentation pour eux ici: https://kotlinlang.org/docs/reference/object-declarations.html#companion-objects

Votre code dans Kotlin ressemblerait à ceci:

class Foo {

    companion object {
        lateinit var instance: Foo
    }

    init {
        instance = this
    }

}

Si vous souhaitez que vos champs/méthodes soient exposés de manière statique aux appelants Java, vous pouvez appliquer l'annotation @JvmStatic :

class Foo {

    companion object {
        @JvmStatic lateinit var instance: Foo
    }

    init {
        instance = this
    }

}
74
Eduard B.

Il semble que vous souhaitiez définir un objet singleton. Kotlin le soutient comme un concept de première classe:

object Foo {
  ... 
}

Tout le code standard avec champ statique et constructeur est pris en charge automatiquement par Kotlin. Vous n'êtes pas obligé d'écrire cela. 

A partir du code Kotlin, vous pouvez simplement vous référer à l'instance de cet objet sous la forme Foo. A partir du code Java, vous pouvez faire référence à l'instance de cet objet sous la forme Foo.INSTANCE, car le compilateur Kotlin crée automatiquement le champ statique correspondant nommé INSTANCE.

24
Roman Elizarov

commencez par créer une classe simple puis créez un bloc suivi du mot-clé de l’objet compagnon

par exemple: 

class Test{

    companion object{

        fun  getValue(): String{

           return "Test String"

        }
    }
}

vous pouvez appeler cette fonction de classe en utilisant le nom de la classe 

par exemple:

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

Vous pouvez créer un objet compagnon pour la classe et si vous définissez réellement le champ statique, vous pouvez utiliser l'annotation @JvmStatic. Les objets compagnon ont accès aux membres privés de la classe pour laquelle ils sont compagnons.

Voir ci-dessous un exemple:

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"
    }
}
0
jtonic