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;
}
}
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
}
}
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
.
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()
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"
}
}