блок инициализации в Kotlin с более чем 2 конструкторами

#android #kotlin

#Android #kotlin

Вопрос:

Обнаружено, что init {} блок выполняется перед вторичным конструктором.

Итак, в основном у меня есть два конструктора ( primary и secondary ). Primary используется только для инициализации простого представления. Вторичный — попытка заполнить EditViews данными. После secondary конструктора я ожидаю, что init блок будет выполнен.

Есть ли способ заставить это произойти?

 class EditView(val context: Context){
    constructor(context: Context, title: String): this(context) {
        // Executes after init block
    }

    init {
        // Ran before secondary constructor
        // Code for initializing my view
    }
}
  

Ответ №1:

Вы не можете этого сделать, поскольку init блоки по сути являются телом основного конструктора (как и любые встроенные инициализаторы свойств). Это означает, что он будет выполняться при вызове основного из вторичного с помощью this(context) , и только после этого вы сможете запустить код в вашем вторичном конструкторе.

Первый запуск основного конструктора гарантирует, что ваш экземпляр уже находится в допустимом сконструированном состоянии для запуска тела основного конструктора — например, ненулевые свойства имеют ненулевое значение и т.д.

Комментарии:

1. Спасибо за отличное объяснение!