在Kotlin课堂上的初始块位置

时间:2017-11-23 04:58:54

标签: class constructor initialization kotlin init

我最近遇到过一种情况,即使我使用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"

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

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

这对我来说很奇怪。任何人都可以解释为什么会这样吗?

2 个答案:

答案 0 :(得分:3)

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

从文档(An in-depth look at Kotlin’s initializers)初始化程序(属性初始值设定项和初始化块)按照在类中定义的顺序执行,从上到下

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

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

初始值设定项在类的主要构造函数的开头从上到下运行。

这是正确的方法

class Example(function: Example.() -> Unit) {
var name = "default name"
init {
    function()
}
}

答案 1 :(得分:0)

如 Kotlin 文档中所述:

<块引用>

在实例初始化期间,初始化块按照它们出现在类主体中的相同顺序执行,与属性交错初始值设定项:...

https://kotlinlang.org/docs/classes.html#constructors