Ich möchte eine Klasseninstanz in einer öffentlichen statischen Variablen speichern können, kann aber nicht herausfinden, wie dies in Kotlin gemacht wird.
class Foo {
public static Foo instance;
public Foo() {
instance = this;
}
}
Antworten:
Das, was Javas statischen Feldern am nächsten kommt, ist ein Begleitobjekt. Die Dokumentationsreferenz für sie finden Sie hier: https://kotlinlang.org/docs/reference/object-declarations.html#companion-objects
Ihr Code in Kotlin würde ungefähr so aussehen:
class Foo { companion object { lateinit var instance: Foo } init { instance = this } }
Wenn Sie möchten, dass Ihre Felder / Methoden für Java-Aufrufer als statisch angezeigt werden, können Sie die
@JvmStatic
Anmerkung anwenden :class Foo { companion object { @JvmStatic lateinit var instance: Foo } init { instance = this } }
quelle
companion object
, um eininstance
Feld zu deklarieren , ist eine Boilerplate, die vom Kotlin-Compiler automatischFoo
object Foo { ... }
Es sieht so aus, als ob Sie ein Singleton-Objekt definieren möchten. Es wird in Kotlin als erstklassiges Konzept unterstützt:
object Foo { ... }
Der gesamte Boilerplate-Code mit statischem Feld und Konstruktor wird vom Kotlin automatisch übernommen. Sie müssen nichts davon schreiben.
Aus dem Kotlin-Code können Sie auf die Instanz dieses Objekts einfach als verweisen
Foo
. Aus dem Java-Code können Sie auf die Instanz dieses Objekts als verweisenFoo.INSTANCE
, da der Kotlin-Compiler automatisch das entsprechende statische Feld mit dem Namen erstelltINSTANCE
.quelle
Zuerst erstellen Sie eine einfache Klasse, dann erstellen Sie einen Block, gefolgt von einem Schlüsselwort für das Begleitobjekt
zum Beispiel:
class Test{ companion object{ fun getValue(): String{ return "Test String" } } }
Sie können diese Klassenfunktion mit dem Klassennamen dot function name aufrufen
zum Beispiel:
// here you will get the function value Test.getValue()
quelle
Sie können ein Begleitobjekt für die Klasse erstellen. Wenn das Feld
static
angezeigt werden soll , können Sie die Annotation @JvmStatic verwenden. Companion-Objekte haben Zugriff auf private Mitglieder der Klasse, für die es Companion ist.Siehe unten ein Beispiel:
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" } }
quelle