statische Methoden und Variablen in Kotlin?

Lesezeit: 3 Minuten

Caleb Basshams Benutzeravatar
Caleb Bassham

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

Benutzeravatar von Eduard B
Eduard B.

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:

Den statischen Feldern von Java am nächsten kommt ein Begleitobjekt. Die entsprechende Dokumentationsreferenz finden Sie hier: https://kotlinlang.org/docs/reference/object-declarations.html#companion-objects

Ihr Code in Kotlin würde etwa so aussehen:

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

Benutzeravatar von Rakesh Rajput
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() 

Benutzeravatar von jtonic
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"
    }
}

1454120cookie-checkstatische Methoden und Variablen in Kotlin?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy