调用时Kotlin不可变字段为null

时间:2018-07-26 21:56:29

标签: kotlin

这是代码段:

abstract class SuperClass {
    init {
        toOverride()
    }

    abstract fun toOverride()
}

class ChildClass : SuperClass() {
    private val innerClass = InnerClass()

    override fun toOverride() {
        innerClass.doSomething()
    }

    class InnerClass {
        fun doSomething() = Unit
    }
}

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val superClass = ChildClass()
        superClass.toOverride()
    }
}

调用superClass.toOverride()将导致空指针异常,但从ChildClass的角度来看,innerClass是一个不可变的字段。问题在于,在SuperClass的构造函数中正在调用toOverride()。

在很多情况下,我们无法控制SuperClass的编写方式。在android框架中,有很多这样的情况,例如http://androidxref.com/8.0.0_r4/xref/frameworks/base/core/java/android/view/View.java#20160将在View.java的构造函数中调用。我们如何解决这些问题?添加空检查将触发IDE警告,并且如果您使用?,则好像kotlin编译器有时会修剪空检查。运算符,因为它认为?。没必要。

1 个答案:

答案 0 :(得分:1)

首先,我会读What's wrong with overridable method calls in constructors?

这样一来,如果您真的无法控制父类的工作,并且确实需要它来执行其工作,则可能可以执行以下操作(仅显示{{1} }:

ChildClass

我的建议是考虑您的类层次结构是否有替代实现。