已关闭,此问题为opinion-based。目前不接受答复。
**想改善这个问题吗?**更新问题,以便editing this post可以用事实和引用来回答。
昨天关门了。
Improve this question
我有一个枚举类,我想找到枚举。
enum class Stage(val title: String) {
ONE("one"),
TWO("two");
companion object {
// 1st option
fun fromTitle(title: String) {
values().firstOrNull { it.title.equals(title, true) }
}
// 2nd option
private val mapByTitle = Stage.values().associateBy(Stage::title)
fun fromTitle(title: String) = mapByTitle[title.lowercase()]
}
}
哪个是惯用选项还是其他选项
2条答案
按热度按时间y53ybaqx1#
TL;DR:使用第二种方法。
还请注意,在Kotlin1.9中,将有a new Kotlin way来访问这些条目(
entries
属性而不是values()
函数)。它应该已经在preview right now in 1.8.21中了。至于你的问题,你提到的方法之间有一些显着的差异:
values()
在每次调用时都会创建一个新数组,因此如果重复调用第一个选项,则会创建一堆数组(这应该由我提到的新Kotlin特性解决)firstOrNull
是在条目列表中进行线性搜索,而使用map则允许不断访问枚举的值,理论上对于具有大量条目的大型枚举应该更快,尽管在测量之前我不会太担心这个特定问题第一点是相当重要的。尽管第一种方法可读性稍强,但它也是非常本地化的,因此不必经常阅读。所以我肯定会选择第二种方法。
ioekq8ef2#
从惯用的Angular 来看,这两个选项都是惯用的。
但从性能方面来看,第二种选择更高效,因为它使用Map来存储值,并允许常数时间查找(第一种允许线性时间查找)