Kotlin初始化:如何失败



我需要将FirebaseDataSnapshot(一个JSON对象(解析为一个数据类,其属性包括enum和list。因此,我更喜欢通过将DataSnapshot传递到辅助构造函数来手动解析它。但是,如果DataSnapshot中缺少一些字段,我希望构建失败。在Swift中,它有一个返回null的失败初始值设定项,所以我知道它失败了。如何在科特林做到这一点?

以下是我的尝试,但我认为你不能只是从构造函数返回,对吧?

data class Unit(val name: String, val type: UnitType, val components: List<Component>) {
constructor(snapshot: DataSnapshot) {
name = snapshot.child("name").value as? String ?: return
val typeString = snapshot.child("type").value as? String ?: return
type = UnitType.values().firstOrNull { it.abbrv == typeString } ?: return
...
}
}

有一个require函数是为此目的而设计的:

// ...
init {
require(foo == "bar") {
"$foo should be equal to 'bar'"
}
}

还有requireNotNullcheckerror等。这些在Kotlin中被称为前提。这里没有魔法,它们只是一些辅助函数。你可以在这里查看实际来源,它非常有用。这里有一篇关于这个话题的相关博客文章。

不,你不能只从构造函数返回-这在概念上没有多大意义-但由于我对Kotlin语法相当天真,我将在这里回答一个更广泛的范式。

您的数据类不负责错误检查或错误处理。它只负责存储数据。因此,您应该依赖工厂模式来解析DataSnapshot的结果,并在没有字段丢失的情况下有条件地实例化Unit的新实例。

最新更新