Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
初始化init块中的变量,并为kotlin中的变量定义一个setter_Kotlin_Variables_Getter Setter - Fatal编程技术网

初始化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
块中调用此函数不一定足够,因为它可能会使属性处于未初始化状态

为了防止出现这种情况,编译器要求您在使用自定义设置器时,在属性声明处设置一个值