Kotlin初始化:如何失败

时间:2018-07-12 14:52:34

标签: kotlin initialization

我需要将Firebase DataSnapshot(一个JSON对象)解析为一个数据类,其属性包括枚举和列表。因此,我更喜欢通过将DataSnapshot传递到辅助构造函数中来进行手动解析。但是,如果DataSnapshot中缺少某些字段,我希望构建失败。在Swift中,它具有返回null的失败初始化器,因此我知道它已失败。如何在Kotlin中做到这一点?

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

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
        ...
    }

}

2 个答案:

答案 0 :(得分:5)

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

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

还有requireNotNullcheckerror等。这些在Kotlin中称为前提条件。这里没有魔术,它们只是一些辅助功能。您可以检查实际的来源here,这非常有用。有一则有关主题here的相关博客文章。

答案 1 :(得分:1)

不,您不能只是从构造函数中返回-从概念上讲并没有多大意义-但由于我对Kotlin语法相当幼稚,因此我将在这里回答更广泛的范式。

您的数据类不负责错误检查或错误处理。它仅负责存储数据。因此,您应该依靠工厂模式来解析DataSnapshot的结果,并且仅当没有任何字段丢失时,才有条件地实例化Unit的新实例。