Statischer Initialisierungsblock in Kotlin


83

Was entspricht einem statischen Initialisierungsblock in Kotlin?

Ich verstehe, dass Kotlin so konzipiert ist, dass es keine statischen Dinge enthält. Ich suche etwas mit äquivalenter Semantik - Code wird einmal ausgeführt, wenn die Klasse zum ersten Mal geladen wird.

Mein spezieller Anwendungsfall ist, dass ich die DayNight-Funktion aus der Android AppCompat-Bibliothek aktivieren möchte und die Anweisungen besagen, dass Code in den statischen Initialisierungsblock der ApplicationKlasse eingefügt werden soll .

Antworten:


122

Unter bestimmten Gesichtspunkten entsprechen companion objects in Kotlin statischen Teilen von Java-Klassen. Insbesondere werden sie vor der ersten Verwendung der Klasse initialisiert. Auf diese Weise können Sie ihre initBlöcke als Ersatz für statische Java-Initialisierer verwenden:

class C {
    companion object {
        init {
            //here goes static initializer code
        }
    }
}

1
Begleiter Objekt ist ein Overkill hier
Voddan

4
@voddan, OP fragte nach der Ausführung von Code vor der ersten Verwendung einer vorhandenen Klasse. Die Lösung mit der objectDeklaration erfordert, dass sie aufgrund der verzögerten Initialisierung tatsächlich irgendwo verwendet wird.
Hotkey

1
@voddan Möchtest du erklären, warum es ein Overkill ist und welche Alternativen es gibt?
Marcin Koziński

2
Entschuldigung, mein Schlechtes, ich habe mich geirrt zu glauben, dass Sie sich nicht um das Laden der Klasse gekümmert haben. Das Begleitobjekt ist hier die richtige Lösung
Voddan

3
companion object  { 
    // Example for a static variable
    internal var REQUEST_CODE: Int? = 500

    // Example for a static method
    fun callToCheck(value: String): String {
        // your code
    }
}

Eine Objektdeklaration innerhalb einer Klasse kann mit dem Companion-Schlüsselwort markiert werden. Darunter können wir wie die statische Java-Methode und die Variable.LIke classname.methodname oder classname.variablename verwenden


Fügen Sie einige Erklärungen zu Ihrem Code hinzu
Freelancer

@DerickDaniel bitte jetzt überprüfen.
Abhilasha Yadav
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.