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

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