Properties Kotlin:如何在构造函数中访问属性

Properties Kotlin:如何在构造函数中访问属性,properties,delegates,kotlin,Properties,Delegates,Kotlin,考虑以下类别: class Test() { init { log(foo) } val foo = "Bar" } 当我启动测试时,它会产生一个NullPointerException,因为foo似乎没有初始化。这种行为真的是故意的吗?有解决方法吗?类的主体从上到下执行。如果要在属性初始化后运行某段代码,应将其放低: class Test() { val foo = "Bar" init { log(foo)

考虑以下类别:

class Test() {
    init {
        log(foo)
    }

    val foo = "Bar"
}

当我启动测试时,它会产生一个NullPointerException,因为foo似乎没有初始化。这种行为真的是故意的吗?有解决方法吗?

类的主体从上到下执行。如果要在属性初始化后运行某段代码,应将其放低:

class Test() {
    val foo = "Bar"

    init {
        log(foo)
    }
}

类的主体从上到下执行。如果要在属性初始化后运行某段代码,应将其放低:

class Test() {
    val foo = "Bar"

    init {
        log(foo)
    }
}

安德烈,谢谢你的回答。我的问题是编译器不允许我将构造函数放在委托属性之后,因为它认为块是作为参数传递的lambda表达式。我发现你可以在属性后面加一个分号来防止这种情况。将此标记为正确答案。注意:;在当前Kotlin中,不需要通过@Andrey添加来分隔初始化块,而是在块前面添加关键字init。这个答案应该更新到当前的Kotlin。Andrey,谢谢你的回答。我的问题是编译器不允许我将构造函数放在委托属性之后,因为它认为块是作为参数传递的lambda表达式。我发现你可以在属性后面加一个分号来防止这种情况。将此标记为正确答案。注意:;在当前Kotlin中,不需要通过@Andrey添加来分隔初始化块,而是在块前面添加关键字init。此答案应更新为当前Kotlin。请注意,当前Kotlin要求初始化块前面现在有init关键字。问题中的语法已经过时。请注意,当前kotlin要求初始化块前面现在有init关键字。这个问题的语法已经过时了。