在Kotlin中,模式匹配很好,并且在90%的用例中,它不执行下一个模式匹配也很不错。
在Android中,当数据库更新时,如果不让代码看起来像这样,我们将使用Java switch属性进行下一种情况:
switch (oldVersion) {
case 1: upgradeFromV1();
case 2: upgradeFromV2();
case 3: upgradeFromV3();
}
因此,如果某人拥有一个数据库版本为1的应用程序,而错过了DB v2版本的应用程序,那么他将获得所有所需的升级代码。转换为Kotlin后,我们会像这样困惑:
when (oldVersion) {
1 -> {
upgradeFromV1()
upgradeFromV2()
upgradeFromV3()
}
2 -> {
upgradeFromV2()
upgradeFromV3()
}
3 -> {
upgradeFromV3()
}
}
这里只有3个版本,假设DB达到19版。反正以相同的方式做出 Action 然后切换?我试图继续没有运气。
最佳答案
简单但罗word的解决方案是:
if (oldVersion <= 1) upgradeFromV1()
if (oldVersion <= 2) upgradeFromV2()
if (oldVersion <= 3) upgradeFromV3()
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]()
}
}