Kotlin - 如何知道常量对象中是不是存在字符串?

Posted

技术标签:

【中文标题】Kotlin - 如何知道常量对象中是不是存在字符串?【英文标题】:Kotlin - how to know if a String is present in a Constant object?Kotlin - 如何知道常量对象中是否存在字符串? 【发布时间】:2021-06-01 00:42:02 【问题描述】:

我正在开发一个 android 应用程序,我在常量文件中创建了一个 object 来存储一些状态值。在我的一个课程中,我有一个Status 类型的变量。我需要从后端获得的一些数据中设置状态值。但是,数据采用String 形式。有什么方法可以检查数据字符串是否在Status 对象中,并可能将此字符串转换为Status

注意:可以有许多自定义类型,例如 Status,因此考虑到它们的性能影响,我想尽可能避免使用枚举。

考虑以下场景

// Constants.kt
object Constants 
    ...
    object Status 
        const val OKAY = "okay"
        const val DONE = "done"
        const val PENDING = "pending"
    
    ...



// SomeClass.kt
class SomeClass 
    private var status: Status? = null

    setStatus(status: Status) 
        this.status = status
    


// SomeOtherClass.kt
fun updateStatus() 
    val someClass = SomeClass()
    val status: String = getSomeStringFromServer()
    // add some check to confirm whether status is actually one of Constants.Status
    someClass.setStatus(status) // It wouldn't work because type String and Status are incompatible


【问题讨论】:

我不确定如果后端的字符串与 Status 类变量中的一个匹配会发生什么 【参考方案1】:

如果这只是一些有限的推理状态,那么您可以轻松使用enum

enum class Status(val value : String) 
    OKAY("okay"),
    DONE("done"),
    PENDING("pending")

然后为了将服务器字符串转换成Status

val valueFromServer = "okay"
val status : Status? = enumValues<Status>().firstOrNull  it.value == valueFromServer 

这适用于已知类型,当Status 为空时,您可以轻松处理未知类型。

为了方便你也可以创建一个扩展函数:

 private fun String.toStatus() : Status? = enumValues<Status>().firstOrNull  it.value == this 

用法:

"okay".toStatus()

【讨论】:

但是使用枚举在性能/内存方面不是很糟糕,尤其是因为我将拥有大量这样的自定义类型吗? “我将拥有大量这样的自定义类型” - 你的问题中没有提到 - 这只是谈论Status。对于您在问题中的示例,对于与随机字符串常量相对的受限有限类型,枚举更具声明性和显式性 - 考虑到它们只是字符串,它们非常通用。枚举不适用于未知类型,如果需要解析或调整,您可以使用集合或其他方式解析值。 我更新了我的问题陈述以增加清晰度。谢谢!

以上是关于Kotlin - 如何知道常量对象中是不是存在字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 Javascript 中是不是存在字符串/数组/对象? [复制]

如何在 Kotlin 中解析 JSON?

Kotlin 学习笔记—— 基本类型函数lambda类与对象的写法

测试字符串是不是包含字符串数组中的任何内容(kotlin)

Java你可能不知道的事系列1

如何知道Json字符串中是不是存在密钥[重复]