在 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 对警告调用意向操作来完成此转换(Alt + 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
}
}
我有以下代码:
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 对警告调用意向操作来完成此转换(Alt + 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
}
}