Инициировать свойство с помощью сеттера в основном конструкторе в Kotlin

У меня есть следующий код:

class Camera : AsyncActiveInputDevice<Image> {
    constructor(inputListener: ((Image) -> Unit)? = null) {
        this.inputListener = inputListener
    }

    override var inputListener: ((Image) -> Unit)?
        set(value) {
            field = value
            TODO("call C/Python implementation")
        }
}

И IntelliJ IDEA предлагает преобразовать конструктор в первичный конструктор.

Так как конвертировать это? Как инициировать свойство с помощью сеттера в основном конструкторе? я пытался init блокирует, но затем выдает ошибку: "Переменная не может быть инициализирована до объявления".

2 ответа

Решение

Такой первичный конструктор будет идти в заголовке класса, например так:

class Camera(inputListener: ((Image) -> Unit)? = null) : AsyncActiveInputDevice<Image> {

    override var inputListener: ((Image) -> Unit)? = inputListener
        set(value) {
            field = value
            TODO("call C/Python implementation")
        }

}

Вы можете выполнить это преобразование в среде IDE, вызвав намеренные действия в предупреждении (Alt + Enter в Windows, ⌥↩ в macOS) и выбрав Преобразовать в основной конструктор.

Блок init должен идти после объявления переменной. Вот что сообщение об ошибке говорит вам:

class Camera(inputListener: ((Image) -> Unit)? = null): AsyncActiveInputDevice<Image> {

    override var inputListener: ((Image) -> Unit)? = inputListener
        set(value) {
            field = value
            TODO("call C/Python implementation")
        }


    init {
        this.inputListener = inputListener
    }
}
Другие вопросы по тегам