0

我正在开发一个 Android 应用程序,我在其中创建了一个object常量文件来存储一些状态值。在我的一个课程中,我有一个 type 的变量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
}

4

1 回答 1

1

如果这只是一些有限的推理状态,那么您可以轻松使用 a 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()
于 2021-03-02T13:15:33.537 回答