初始化init块中的变量,并为kotlin中的变量定义一个setter
我想写这段代码,但它不起作用初始化init块中的变量,并为kotlin中的变量定义一个setter,kotlin,variables,getter-setter,Kotlin,Variables,Getter Setter,我想写这段代码,但它不起作用 private var a: Int set(value) { field = a // Code } init { a = 2 } 我必须在声明变量时初始化它。为什么会这样?我如何解决它呢?也许您有另一个上下文,但基本上您可以通过给字段赋值来初始化它 private var a:Int=3 这不会执行您的setter。如果这是一个静态值(类的初始状态),那么就可以了 如果a的值在运行时在init块中设置,
private var a: Int
set(value) {
field = a
// Code
}
init {
a = 2
}
我必须在声明变量时初始化它。为什么会这样?我如何解决它呢?也许您有另一个上下文,但基本上您可以通过给字段赋值来初始化它
private var a:Int=3
这不会执行您的setter。如果这是一个静态值(类的初始状态),那么就可以了
如果a
的值在运行时在init
块中设置,并且其值取决于某些现有逻辑,则可以使用属性委托
private var readWrite: Int by resourceDelegate()
fun resourceDelegate(): ReadWriteProperty<Any?, Int> =
object : ReadWriteProperty<Any?, Int> {
var curValue = 0
override fun getValue(thisRef: Any?, property: KProperty<*>): Int = curValue
override fun setValue(thisRef: Any?, property: KProperty<*>, value: Int) {
println("Setting value using resource delegate")
curValue = value
}
}
init {
readWrite = 4
}
private var readWrite:Int by resourceDelegate()
fun resourceDelegate():读写属性=
对象:ReadWriteProperty{
var曲线值=0
重写fun getValue(thisRef:Any?,属性:KProperty):Int=CurveValue
覆盖乐趣设置值(thisRef:Any?,属性:KProperty,值:Int){
println(“使用资源委托设置值”)
曲线值=值
}
}
初始化{
读写=4
}
可能还有其他解决方案,但我们需要更多地了解您的上下文。您在问为什么必须初始化变量? 嗯,不能有未初始化的变量 必须在声明属性时或在
init
块中初始化属性
如果要首先将其单元化,则必须使其可为null,并在声明时将其设置为null:
专用变量a:Int?=无效的
设置(值:Int?){
// ...
}
您的属性有一个自定义setter,当您在init
块中调用a=2
时,该setter的代码将运行
该代码可能是任意复杂的,编译器无法确定它是否会最终设置属性的备份字段的值。在您的代码示例中,它将设置backing字段,并且您的属性将处于有效状态
但是,您也可以使用如下自定义设置器:
private变量a:Int
设置(值){
如果(值>0){
字段=值
}
}
在init
块中调用此函数不一定足够,因为它可能会使属性处于未初始化状态
为了防止出现这种情况,编译器要求您在使用自定义设置器时,在属性声明处设置一个值