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;
}
}
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;
}
}
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
}
}
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
.
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 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 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.