Class Kotlin中类中的初始块位置
我最近遇到了一种情况,我的标准变量的值被默认值替换,即使我使用init block为构造函数赋值 我尝试的是:Class Kotlin中类中的初始块位置,class,constructor,initialization,kotlin,init,Class,Constructor,Initialization,Kotlin,Init,我最近遇到了一种情况,我的标准变量的值被默认值替换,即使我使用init block为构造函数赋值 我尝试的是: class Example(function: Example.() -> Unit) { init { function() } var name = "default name" } // assigning it like this: val example = Example { name = "new name" }
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块放在类的最后一个位置,它会首先用默认名称初始化名称,然后调用函数(),用“新名称”替换该值
如果我把它放在第一位,它找不到名称,当属性初始化时,它被替换为“默认名称”
这对我来说很奇怪。有人能解释为什么会发生这种情况吗?原因是科特林采用了自上而下的方法 从documents()开始,初始值设定项(属性初始值设定项和init块)按照类中定义的顺序从上到下执行 您可以定义多个辅助构造函数,但在创建类实例时只调用一个,除非构造函数显式调用另一个 构造函数还可以具有默认参数值,每次调用构造函数时都会对这些值进行计算。与属性初始值设定项一样,这些可以是函数调用或其他将运行任意代码的表达式 初始值设定项在类的主构造函数开头自上而下运行 这是正确的方法
class Example(function: Example.() -> Unit) {
var name = "default name"
init {
function()
}
}
如Kotlin文件所述: 在实例初始化过程中,初始值设定项块以与类主体中出现的相同顺序执行,与属性初始值设定项交织在一起:
类初始化是自上而下的,初始化块不能免除。这个练习仅仅是为了理解Kotlin初始化吗?如果没有,您可以通过
类示例(val name:String=“default name”)
实现这一点。我试图在我的库()中执行此操作,但在将其放在顶部之后,整个功能就中断了。签出将init块放在底部在大多数情况下都有意义吗?除非你有特殊需要。。。