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.