我最近遇到过一种情况,即使我使用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”替换该值。
如果我把它放在第一位,它就找不到名称,并在初始化属性时将其替换为“默认名称”。
这对我来说很奇怪。任何人都可以解释为什么会这样吗?
答案 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 文档中所述:
<块引用>在实例初始化期间,初始化块按照它们出现在类主体中的相同顺序执行,与属性交错初始值设定项:...