134 votes

Méthodes et variables statiques de Kotlin

Je veux pouvoir sauvegarder 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;
    }

}
 

185voto

Eduard B. Points 4628

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

Votre code dans Kotlin ressemblerait à quelque chose comme ceci:

class Foo {

    companion object {
        lateinit var instance: Foo
    }

    init {
        instance = this
    }

}

Si vous voulez que vos champs/méthodes pour être exposés en statique en Java appelants, vous pouvez appliquer l' @JvmStatic d'annotation:

class Foo {

    companion object {
        @JvmStatic lateinit var instance: Foo
    }

    init {
        instance = this
    }

}

71voto

Roman Elizarov Points 8871

Il semble que vous souhaitez définir un objet singleton. Il est pris en charge dans Kotlin comme un concept de première classe:

object Foo {
  ... 
}

Tous les code réutilisable avec un champ statique et le constructeur est pris en charge par le Kotlin automatiquement. Vous n'avez pas à écrire tout ça.

À partir de la Kotlin code, vous pouvez vous référer à l'instance de cet objet, simplement en tant que Foo. À partir du code Java vous pouvez vous referer à l'instance de cet objet en tant que Foo.INSTANCE, parce que la Kotlin compilateur crée automatiquement le correspondant de champ statique nommée INSTANCE.

20voto

rakesh rajput Points 401

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() 
 

3voto

jtonic Points 84

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 compagnons 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"
    }
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X