我需要将字符串转换为枚举值,但想要一个在字符串不是枚举时返回 null 的函数。
enum class Colors{
Red, Green, Blue
}
如果 testString 是值,我可以使用 Colors.valueOf(testString) ,但如果它无效,则会出现异常,在这种情况下我想要一个 null 。
因为我经常需要这样做,所以扩展功能将是理想的选择。但扩展需要对 Colors 类进行操作,而不是对 Colors 类型的对象进行操作。
有人知道如何编写这样的扩展吗?理想情况下,它对于任何枚举类都是通用的。
编写顶级函数很简单,但我正在寻找一个充当标准“方法”的函数
// instead of
val willGetAnException = Colors.valueOf("Yellow") // standard existing fun
val willGetNull = Colors.valueOrNullOf("Orange") // new fun i seek
理想情况下,它是通用的并且适用于任何枚举
您不需要扩展,因为必须在现有对象上调用它们。您想要一个顶级函数。有一个内置的您可以使用:
/**
* Returns an enum entry with specified name.
*/
@SinceKotlin("1.1")
public inline fun <reified T : Enum<T>> enumValueOf(name: String): T
您可以通过推断类型来调用它,或者显式地调用它:
val a : MyEnumClass = enumValueOf("A")
val b = enumValueOf<MyEnumClass>("B")
然而这个方法不能为空:它会抛出异常java.lang.IllegalArgumentException
对未知值。
但很容易模仿它的行为并让它适用于具有顶级函数的可为空枚举:
inline fun <reified T : Enum<*>> enumValueOrNull(name: String): T? =
T::class.java.enumConstants.firstOrNull { it.name == name }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)