8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

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

Rick James 2月前

25 0

我想写这段代码,但是它不起作用。private var a: Int set(value) { field = a // Code }init { a = 2}当我定义时,我必须初始化变量......

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

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

init {
    a = 2
}

声明变量时必须初始化变量。为什么会发生这种情况?我该如何解决?

帖子版权声明 1、本帖标题:在 init 块中初始化变量,并在 kotlin 中为变量定义一个 setter
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Rick James在本站《oop》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 也许你有另一个上下文,但基本上你可以通过为字段分配一个值来初始化它

    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
    }
    

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

  • 您的属性有一个自定义设置器,当您 a = 2 init ,该设置器的代码将运行。

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

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

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

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

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

返回
作者最近主题: