Kotlin 当在超类的初始化中使用变量时,重写变量将创建NPE
假设我们有以下设置:Kotlin 当在超类的初始化中使用变量时,重写变量将创建NPE,kotlin,Kotlin,假设我们有以下设置: open class Foo(open val img: Image) { val use = img.graphics } class Bar(override val img: BufferedImage) : Foo(img) 初始化时,使用img.width创建NPE。我认为问题在于,显然,即使img直接在Bar中传递到Foo的构造函数中,当它在Foo中使用时,它并不指向它,而是指向Bar类中被重写的变量。如何避免这种情况?此行为是由以下事实引起的:img
open class Foo(open val img: Image) {
val use = img.graphics
}
class Bar(override val img: BufferedImage) : Foo(img)
初始化时,使用
img.width
创建NPE。我认为问题在于,显然,即使img
直接在Bar中传递到Foo的构造函数中,当它在Foo中使用时,它并不指向它,而是指向Bar类中被重写的变量。如何避免这种情况?此行为是由以下事实引起的:img
的getter被重写,并返回不同字段的值(由于Bar
使用不同类型重写img
,因此需要创建类型为BufferedImage
的附加字段)。Foo
构造函数在Bar
中指定该字段之前执行
通常,您应该避免在类的初始化逻辑中使用开放成员,因为它们可能在子类中被重写,并且可能依赖于某些状态,这些状态在超类初始化时尚未正确初始化
对于您的特定情况,将Foo
构造函数中的img
设置为一个简单参数,并明确使用该参数:
open class Foo(img: Image) {
open val img = img
val use = img.graphics
}