【问题标题】:Get Enum type by mapping Enum value always complain null issue Android Kotlin通过映射枚举值获取枚举类型总是抱怨空问题 Android Kotlin
【发布时间】:2021-12-02 16:50:29
【问题描述】:

我有枚举类,我是按值映射的,当我返回枚举值时,它总是抱怨 null 问题。

ConversationStatus.kt

enum class ConversationStatus(val status: String) {
    OPEN("open"),
    CLOSED("closed");

    companion object {
        private val mapByStatus = values().associateBy(ConversationStatus::status)
        fun fromType(status: String): ConversationStatus {
            return mapByStatus[status]
        }
    }
}

这总是抱怨这个问题。我怎样才能解决这个问题?任何建议。谢谢

【问题讨论】:

    标签: android performance kotlin enums


    【解决方案1】:

    有 3 种可能的方式。 如您在屏幕截图中所见,Android Studio 通常擅长建议修复。它建议将返回类型更改为ConversationStatus?,这意味着它可能会返回null。那么它会变成这样:

    companion object {
        private val mapByStatus = values().associateBy(ConversationStatus::status)
        fun fromType(status: String): ConversationStatus? {
            return mapByStatus[status]
        }
    }
    

    另一种方法是通过将!! 添加到return 语句来告诉编译器您确保它始终不为空。像这样:

    companion object {
        private val mapByStatus = values().associateBy(ConversationStatus::status)
        fun fromType(status: String): ConversationStatus {
            return mapByStatus[status]!!
        }
    }
    

    如果您以不是"open""closed" 的状态调用函数,这将导致崩溃

    或者,您可以提供一个后备值。我的意思是,如果您使用不是"open""closed" 的字符串调用函数,它会返回一个默认值。如果你希望它是OPEN,你可以这样做:

    companion object {
        private val mapByStatus = values().associateBy(ConversationStatus::status)
        fun fromType(status: String): ConversationStatus {
            return mapByStatus[status] ?: OPEN
        }
    }
    

    【讨论】:

    • 而不是!!,最好使用getValue函数
    • @IR42 为什么会这样?我想这是主观的,但我不明白为什么会更好。唯一的区别是使用无效字符串调用时抛出的异常会有所不同。无论哪种方式,它们都会导致崩溃
    • @IvoBeckers 很好的答案,我将采用 3 种方法。谢谢
    猜你喜欢
    • 1970-01-01
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-12
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多