在 Kotlin 的主构造函数中用 setter 初始化 属性

Init a property with a setter in a primary constructor in 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 建议将构造函数转换为主构造函数。

那么如何转换呢?如何在主构造函数中用 setter 初始化 属性?我已经尝试 init 块,但它随后显示错误:"Variable can not be initialized before declaration".

这样的主构造函数将进入 class 的 header,像这样:

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

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

}

您可以通过 IDE 对警告调用意向操作来完成此转换(A​​lt + Enter on Windows,⌥↩ on macOS),然后选择 Convert to primary constructor.

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