Ich möchte eine Klasseninstanz in einer privaten/öffentlichen statischen Variablen speichern können, kann aber nicht herausfinden, wie das in Kotlin geht.
public class Foo {
private static Foo instance;
public Foo() {
if (instance == null) {
instance = this;
}
}
public static Foo get() {
return instance;
}
}
Aktualisieren: Jeder (wie OP), der nur einen sogenannten „Singleton“, manchmal auch „Service“ genannt (außer in Android), benötigt, sollte einfach Kotlins eingebautes verwenden:
object Foo {
// Done, this already does what OP needed,
// because the boilerplate codes (like static field and constructor),
// are taken care of by Kotlin.
}
(Wie Roman im Kommentarbereich zu Recht betont hat.)
Vorherige Antwort; Wenn Sie mehrere haben (oder planen). static Variablen, dann lesen Sie weiter:
class Foo {
companion object {
private lateinit var instance: Foo
fun get(): Foo {
return instance;
}
}
init {
if (instance == null) {
instance = this
}
}
}
Wenn Sie möchten, dass Ihre Felder/Methoden als statisch für Java-Aufrufer verfügbar gemacht werden, können Sie Folgendes anwenden @JvmStatic Anmerkung:
class Foo {
companion object {
private lateinit var instance: Foo
@JvmStatic fun get(): Foo {
return instance;
}
}
init {
if (instance == null) {
instance = this
}
}
}
Notiz Das @JvmStatic benötigt keinen Import (da es eine integrierte Funktion von Kotlin ist).
Wenn Sie es wie ein verwenden möchten static final Feld in Java ohne Getter, sollten Sie es wahrscheinlich markieren @JvmField
– artaxerx
2. Mai um 7:22 Uhr
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 von Kotlin automatisch verwaltet. Du musst nichts davon schreiben.
Im Kotlin-Code können Sie auf die Instanz dieses Objekts einfach verweisen als Foo. Im Java-Code können Sie auf die Instanz dieses Objekts verweisen als Foo.INSTANCEda der Kotlin-Compiler automatisch das entsprechende statische Feld mit dem Namen erstellt INSTANCE.
Dies ist die viel bessere Lösung. Für meinen Anwendungsfall benötigte ich jedoch eine Klasse, da diese von einem Java-Klassenlader erstellt werden können musste.
– Caleb Bassham
26. Januar 2020 um 0:46
Ein Objekt ist jedoch während des gesamten Projekts zugänglich. Könnte das nicht die Leistung beeinträchtigen?
– Arthur Kasparian
12. Januar um 14:45 Uhr
Rakesh Rajput
Zuerst erstellen Sie eine einfache Klasse, dann erstellen Sie einen Block, gefolgt vom 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 Punkt Funktionsname aufrufen
Zum Beispiel:
// here you will get the function value
Test.getValue()
jtonic
Sie können ein Begleitobjekt für die Klasse und bei Bedarf auch für das Feld erstellen static Sie können die Annotation @JvmStatic verwenden. Begleitobjekte haben Zugriff auf private Mitglieder der Klasse, für die es Begleiter ist.
Unten sehen Sie 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"
}
}
14541200cookie-checkstatische Methoden und Variablen in Kotlin?yes
Wenn Sie einen Singleton erstellen möchten, schauen Sie sich das an kotlinlang.org/docs/reference/….
– Miha_x64
9. Mai 2017 um 13:37 Uhr