Kotlin 中的模式匹配非常好,并且在 90% 的用例中它不会执行下一个模式匹配这一事实是好的。
在 Android 中,当数据库更新时,如果我们不放置中断以使代码如下所示,我们将使用 Java switch 属性继续下一种情况:
switch (oldVersion) {
case 1: upgradeFromV1();
case 2: upgradeFromV2();
case 3: upgradeFromV3();
}
因此,如果有人拥有带有 DB 版本 1 的应用程序,但错过了带有 DB v2 的应用程序版本,他将获得执行的所有所需升级代码。
转换为 Kotlin 后,我们会遇到这样的混乱:
when (oldVersion) {
1 -> {
upgradeFromV1()
upgradeFromV2()
upgradeFromV3()
}
2 -> {
upgradeFromV2()
upgradeFromV3()
}
3 -> {
upgradeFromV3()
}
}
这里我们只有 3 个版本,想象一下当 DB 达到版本 19 时。
无论如何,以相同的方式行事然后切换?我尝试继续,但没有运气。
简单但啰嗦的解决方案是:
if (oldVersion <= 1) upgradeFromV1()
if (oldVersion <= 2) upgradeFromV2()
if (oldVersion <= 3) upgradeFromV3()
另一种可能的解决方案是函数参考 http://kotlinlang.org/docs/reference/reflection.html#function-references:
fun upgradeFromV0() {}
fun upgradeFromV1() {}
fun upgradeFromV2() {}
fun upgradeFromV3() {}
val upgrades = arrayOf(::upgradeFromV0, ::upgradeFromV1, ::upgradeFromV2, ::upgradeFromV3)
fun upgradeFrom(oldVersion: Int) {
for (i in oldVersion..upgrades.lastIndex) {
upgrades[i]()
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)