Kotlin 初始化 : how to fail

标签 kotlin initialization

我需要解析 Firebase DataSnapshot (一个 JSON 对象)转换成一个数据类,其属性包括 enum 和 list。所以我更喜欢通过传递 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
        ...
    }

}

最佳答案

require为此目的而设计的功能:

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

还有requireNotNull , check , error和其他一些。这些在 Kotlin 中称为前提条件。这里没有魔法,它们只是一些辅助函数。您可以查看实际来源here ,非常有用。有一篇关于该主题的相关博客文章 here .

关于Kotlin 初始化 : how to fail,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51308742/

相关文章:

python - 使用 `is (CustomClass)` 可以安全地检测 Python 中的未初始化值

ios - 如何在 IBAction 按钮中初始化 Tile 源一次

java - 我可以简化 Kotlin 或 Java 中监听器的实现吗?

kotlin - Corda事件调度中的可调度状态

android - Android工具栏和 fragment 背景如何使用一种渐变颜色

java - 声明一个变量但不初始化它会提高性能吗?

android - Room查询中的 "="和 "=="有什么区别?

android - 限制用户在 RecyclerView 中滚动

java int[] val 或 int val[]

c++ - 复制构造函数调用方法