Kotlin 'when' statement vs Java 'switch'

前端 未结 10 1114
感情败类
感情败类 2020-12-03 06:41

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 J

10条回答
  •  没有蜡笔的小新
    2020-12-03 06:52

    How about this:

    fun upgradeFromV3() {/* some code */}
    fun upgradeFromV2() {/* some code */ upgradeFromV3()}
    fun upgradeFromV1() {/* some code */ upgradeFromV2()}
    fun upgradeFromV0() {/* some code */ upgradeFromV1()}
    
    fun upgrade(oldVersion: Int) {
        when (oldVersion) {
            1 -> upgradeFromV1()
            2 -> upgradeFromV2()
            3 -> upgradeFromV3()
        }
    }
    

    Added:

    I like the idea by @lukle to define the upgrade path as a list. This allows to define different upgrade paths for different initial stage. For example:

    1. Simple fast path from released version to the latest released version
    2. Catch-up path from hot-fix version (could be few in a row), which should not be applied when going from previous full version to the next full version

    For that we need to know from which elements of the list to apply.

    fun  Pair.apply(upgrade: () -> Unit): (V) -> V {
        return { current: V ->
            if (first == current) {
                upgrade()
                second
            } else {
                current
            }
        }
    }
    
    val upgradePath = listOf(
            (0 to 10).apply  { /* do something */ },
            (5 to 15).apply  { /* do something */ },
            (10 to 20).apply { /* do something */ },
            (15 to 20).apply { /* do something */ },
            (20 to 30).apply { /* do something */ },
            (30 to 40).apply { /* do something */ }
    )
    
    fun upgrade(oldVersion: Int) {
        var current = oldVersion
        upgradePath.forEach { current = it(current) }
    }
    

    In this code Vs could be the same as V or some kind of collection of V values with overridden equals(other: Any?): Boolean method.

提交回复
热议问题