Блок статической инициализации в Котлине


84

Что эквивалентно блоку статической инициализации в Котлине?

Я понимаю, что в Kotlin нет статичных вещей. Я ищу что-то с эквивалентной семантикой - код запускается один раз при первой загрузке класса.

Мой конкретный вариант использования заключается в том, что я хочу включить функцию DayNight из библиотеки Android AppCompat, и в инструкциях говорится, что нужно поместить некоторый код в блок статической инициализации Applicationкласса.

Ответы:


123

С некоторой точки зрения companion objects в Kotlin эквивалентны статическим частям классов Java. В частности, они инициализируются перед первым использованием класса, и это позволяет вам использовать их initблоки в качестве замены статических инициализаторов Java:

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

1
объект-компаньон здесь перебор
воддан

4
@voddan, OP спросил о выполнении кода перед первым использованием существующего класса. Решение с objectобъявлением требует фактического использования его где-то из-за ленивой инициализации.
горячая клавиша

1
@voddan Не могли бы вы объяснить, почему это излишество и каковы были бы альтернативы?
Marcin Koziński

2
Извините, мое плохое, я ошибался, полагая, что вас не заботила загрузка класса. Объект-компаньон - правильное решение здесь
voddan

Если статическая инициализация - это все, что вы хотите достичь, то сопутствующий объект, вероятно, следует сделать закрытым или защищенным.
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
    }
}

Объявление объекта внутри класса может быть помечено ключевым словом companion. И под этим мы можем использовать как статический метод java, так и переменную. LIke classname.methodname или classname.variablename


ДОБАВИТЬ ПОЯСНЕНИЯ К СВОЕМУ КОДУ
Freelancer

@DerickDaniel, пожалуйста, проверьте сейчас.
abhilasha Yadav
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.