在初始化超类的继承者时,在其init块中使用抽象val函数时,意外的NPE出现在我的应用程序中,这让我感到困惑.或许有人能解释一下为什么会这样.仅供参考,我通过使用抽象函数暂时解决了这个问题,但我仍然不明白为什么会发生这种情况.
我的超类只是包装了另一个组件,以便更好地表示状态.在init函数中有一个公共的使能函数,它可以导致立即回调,该回调将访问继承类中设置的抽象函数.这会导致NPE,我不知道为什么,因为继承类中的值被正确地覆盖了.以下是代码以及对该问题的一些解释注释:
abstract class SomeSuperClass(private val foundation: SomeFoundation) {
private val callback = object : SomeCallback() {
override fun onAvailable(network: Network) {
super.onAvailable(network)
onAvailable() // Accesses the inheritor which can cause an NPE on init
}
override fun onLost(network: Network) {
super.onLost(network)
onLost()
}
}
init {
val manager: SomeManager = SomeManager()
manager.registerCallback(callback) // Can cause an immediate callback, this is probably why the NPE happens rarely, since it does not always cause an immediate callback.
}
abstract val onAvailable: () -> Unit
abstract val onLost: () -> Unit
}
/** Singleton inheritor. */
class SomeInheritingObject private constructor(): SomeSuperClass(foundation = SomeFoundation()) {
private val _state: MutableStateFlow<State> = MutableStateFlow(State.Initial)
val state: StateFlow<State> = _state
// This overriden val is not allocated when super.init is called, why?
override val onAvailable: () -> Unit = {
_state.value = State.Available
}
override val onLost: () -> Unit = {
_state.value = State.Unavailable
}
// This is a singleton component
companion object {
private val observer: SomeInheritingObject by lazy { SomeInheritingObject() }
fun getInstance(): SomeInheritingObject = observer
}
}
我希望在Super.init中设置被覆盖的抽象函数值,也许它们不是.在这种情况下,如果有人能向我推荐一些文档,我将不胜感激.