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

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

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

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


person Marcin Koziński    schedule 16.05.2016    source источник
comment
проверить это ???? init-blocks kotlin vs Java Я объяснил, что такое блок инициализации и как он вызывается, плюс чем он отличается от блока инициализации Java, статических блоков инициализации и т. д.   -  person Chetan Gupta    schedule 26.01.2021


Ответы (2)


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

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

@voddan это не излишество, на самом деле это то, что предлагается на сайте Kotlin: сопутствующий объект инициализируется при загрузке (разрешении) соответствующего класса, что соответствует семантике статического инициализатора Java. Семантическая разница между объектными выражениями и объявлениями

person hotkey    schedule 16.05.2016
comment
объект-компаньон здесь является излишним - person voddan; 17.05.2016
comment
@voddan, OP спросил о выполнении кода перед первым использованием существующего класса. Решение с объявлением object требует, чтобы кто-то фактически использовал его где-то из-за ленивой инициализации. - person hotkey; 17.05.2016
comment
@voddan Не могли бы вы объяснить, почему это излишество и какие есть альтернативы? - person Marcin Koziński; 11.07.2016
comment
Извини, мой плохой, я ошибся, думая, что тебя не волнует загрузка классов. Объект-компаньон — правильное решение здесь - person voddan; 11.07.2016
comment
Если статическая инициализация — это все, чего вы хотите добиться, то объект-компаньон, вероятно, следует сделать закрытым или защищенным. - person mipa; 01.01.2021

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

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

person abhilasha Yadav    schedule 19.07.2018
comment
ДОБАВЬТЕ НЕКОТОРЫЕ ОБЪЯСНЕНИЯ К ВАШЕМУ КОДУ - person Derick Daniel; 19.07.2018
comment
@DerickDaniel, пожалуйста, проверьте сейчас. - person abhilasha Yadav; 19.07.2018