微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 init 块中初始化变量并在 kotlin 中为变量定义一个 setter

如何解决在 init 块中初始化变量并在 kotlin 中为变量定义一个 setter

我想写这段代码但它不起作用。

private var a: Int
    set(value) {
        field = a
        // Code
    }

init {
    a = 2
}

我必须在声明变量时对其进行初始化。为什么会发生?我该如何解决

解决方法

您的属性有一个自定义的 setter,当您在 a = 2 块中调用 init 时,该 setter 的代码将运行。

该代码可能非常复杂,编译器无法确定它最终是否会设置属性的支持字段的值。在您的代码示例中,它将设置支持字段,并且您的属性将处于有效状态。

但是,您也可以使用自定义设置器,例如:

private var a: Int
    set(value) {
        if (value > 0) {
            field = value
        }
    }

init 块中调用它不一定足够,因为它可能会使属性处于未初始化状态。

为了防止这种情况发生,编译器会要求您在使用自定义 setter 时在其声明中为该属性设置一个值。

,

也许你有另一个上下文,但基本上你可以通过给字段赋值来初始化它

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
}

可能还有其他解决方案,但为此我们需要更多地了解您的背景。

,

你问为什么必须初始化变量? 好吧,你不能有未初始化的变量。

您必须在声明属性时或在 init 块中初始化属性。

如果要先对其进行单元化,则必须在声明时将其设为可空并设置为空:

private var a: Int? = null
    set(value: Int?) {
        // ...
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。