Инициировать свойство с помощью сеттера в основном конструкторе в 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
}
}