javaswitch-statementkotlin

Kotlin 'when' statement vs Java 'switch'


Pattern matching in Kotlin is nice and the fact it does not execute the next pattern match is good in 90% of use cases.

In Android, when database is updated, we use Java switch property to go on next case if we do not put a break to have code looking like that:

switch (oldVersion) {
    case 1: upgradeFromV1();
    case 2: upgradeFromV2(); 
    case 3: upgradeFromV3();
}

So if someone has an app with version 1 of the DB and missed the app version with DB v2, he will get all the needed upgrade code executed.

Converted to Kotlin, we get a mess like:

when (oldVersion) {
    1 -> {
        upgradeFromV1()
        upgradeFromV2()
        upgradeFromV3()
    }
    2 -> {
        upgradeFromV2()
        upgradeFromV3()
    }
    3 -> {
        upgradeFromV3()
    }
}

Here we have only 3 versions, imagine when DB reaches version 19.

Anyway to makes when acting in the same way then switch? I tried to continue without luck.


Solution

  • Simple but wordy solution is:

    if (oldVersion <= 1) upgradeFromV1()
    if (oldVersion <= 2) upgradeFromV2()
    if (oldVersion <= 3) upgradeFromV3()
    

    Another possible solution with 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]()
        }
    }