Блок статичної ініціалізації в Котліні


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
Вибачте, погано, я помилявся, думаючи, що ви не дбали про завантаження класу. Об’єкт-супутник є правильним рішенням тут
воддан

Якщо статична ініціалізація - це все, чого ви хочете досягти, тоді супутній об’єкт, можливо, слід зробити приватним або захищеним.
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 та змінну. Як і ім'я класу.


ДОДАТИ ДЕЯКЕ ПОЯСНЕННЯ ДО ВАШОГО КОДУ
Фрілансер

@DerickDaniel, будь ласка, перевір зараз.
абхілаша Ядав
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.