Kotlin 类中的初始化块位置

kir*_*403 4 constructor initialization class init kotlin

我最近遇到了一种情况,即使我使用 init 块为构造函数分配了一个值,我的标准变量的值也会被默认值替换。

我尝试的是:

class Example(function: Example.() -> Unit) {

    init {
        function()
    }

    var name = "default name"

}


// assigning it like this:
val example = Example { name = "new name" }

// print value
print(example.name)  // prints "default name"
Run Code Online (Sandbox Code Playgroud)

经过一番挣扎,我发现 init 块的位置很重要。如果我将 init 块放在类的最后一个,它首先使用默认名称初始化名称,然后调用 function() 将值替换为“新名称”。

如果我把它放在第一位,它没有找到名称,并且在初始化属性时将其替换为“默认名称”。

这对我来说很奇怪。谁能解释为什么会这样?

sas*_*mar 11

原因是 kotlin 遵循自上而下的方法

从文档(深入了解 Kotlin 的初始化器)中,初始化器(属性初始化器和 init 块)按照它们在类中定义的顺序执行,从上到下

您可以定义多个辅助构造函数,但在创建类实例时只会调用一个,除非构造函数显式调用另一个。

构造函数也可以有默认参数值,每次调用构造函数时都会评估这些值。与属性初始值设定项一样,它们可以是函数调用或将运行任意代码的其他表达式。

初始化器在类的主构造函数的开头从上到下运行。

这是正确的方法

class Example(function: Example.() -> Unit) {
var name = "default name"
init {
    function()
}
}
Run Code Online (Sandbox Code Playgroud)