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 中是不是存在字符串/数组/对象? [复制]