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

时间:2018-11-26 08:11:20

标签: kotlin constructor properties primary-constructor

我有以下代码:

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块,但是它显示了一个错误:“变量不能在声明前初始化”。

2 个答案:

答案 0 :(得分:2)

这样的主要构造函数会放在类的标题中,如下所示:

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

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

}

您可以通过对警告调用意图操作(在Windows上为 Alt + Enter ,在macOS上为⌥↩)并选择转换为主要构造函数

答案 1 :(得分:2)

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