Statyczny blok inicjalizacyjny w Kotlinie


84

Jaki jest odpowiednik statycznego bloku inicjalizacyjnego w Kotlinie?

Rozumiem, że Kotlin nie ma statycznych rzeczy. Szukam czegoś z równoważną semantyką - kod jest uruchamiany raz przy pierwszym załadowaniu klasy.

Mój konkretny przypadek użycia polega na tym, że chcę włączyć funkcję DayNight z biblioteki Android AppCompat, a instrukcje mówią, aby umieścić kod w bloku statycznej inicjalizacji Applicationklasy.

Odpowiedzi:


123

Z pewnego punktu widzenia companion objects w Kotlinie są odpowiednikami statycznych części klas Javy. W szczególności są one inicjowane przed pierwszym użyciem klasy, co pozwala na użycie ich initbloków jako zamienników statycznych inicjatorów Java:

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

1
obiekt towarzyszący jest tutaj
przesadą

4
@voddan, OP zapytał o wykonanie kodu przed pierwszym użyciem istniejącej klasy. Rozwiązanie z objectdeklaracją wymaga, aby faktycznie gdzieś go użyć z powodu leniwej inicjalizacji.
skrót klawiszowy

1
@voddan Czy zechciałbyś wyjaśnić, dlaczego jest to przesada i jakie byłyby alternatywy?
Marcin Koziński

2
Przepraszam, mój błąd, pomyliłem się, sądząc, że nie obchodziło cię ładowanie zajęć. Obiekt towarzyszący jest tutaj właściwym rozwiązaniem
voddan

Jeśli wszystko, co chcesz osiągnąć, to inicjalizacja statyczna, prawdopodobnie obiekt towarzyszący powinien zostać ustawiony jako prywatny lub chroniony.
mipa

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

Deklarację obiektu wewnątrz klasy można oznaczyć słowem kluczowym companion, a pod nim możemy użyć metody statycznej java i zmiennej. LIke nazwa klasy.nazwa metody lub nazwa klasy.nazwa_zmiennej


DODAJ KILKA WYJAŚNIEŃ DO SWOJEGO KODU
Freelancer,

@DerickDaniel, sprawdź teraz.
abhilasha Yadav
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.