Kotlin:为什么要“退出”从'if'中解脱出来? (Android工作室推荐)

问题描述 投票:0回答:3

以下代码(简化示例):

/** Determine if a is less than 15 and b is more than 15. **/
fun isFifteenBetween(val a: Int, val b: Int) {
    if((a < 15) && (b > 15)) { return(true) }
    else { return(false) }
}

应该让isFifteenBetween(3, 20)返回true,isFifteenBetween(20, 3)返回false。但是,我从Android studio(v3.4)获得以下建议:

Return should be lifted out of 'if'
Inspection info: This inspection reports if, when and try statements
that can be converted to expressions by lifting a return or an assignment out.
Typical example:

fun foo(arg: Boolean): String {
    when (arg) {
        true -> return "Truth"
        false -> return "Falsehood"
    }
}

我在stackoverflow上找到的唯一相关问题是Kotlin: Return can be lifted out of 'when',但我认为这似乎并不能涵盖我的情况。

  1. 我的代码应该如何编写?我不明白Android studio提供的'when'表达式应该如何适合我的情况。
  2. Android工作室的推荐仅仅是品味和舒适的问题,还是在这种情况下代码的更改会对性能产生影响?
  3. 是否有可用于最佳实践的指南?
android android-studio kotlin
3个回答
2
投票

官方惯例是更愿意返回表达本身:https://kotlinlang.org/docs/reference/coding-conventions.html#using-conditional-statements

这说来android studio的例子应该成为:

return when (arg) {
    true -> "Truth"
    false -> "Falsehood"
} 

这会将isFifteenBetween的代码更改为:

/** Determine if a is less than 15 and b is more than 15. **/
fun isFifteenBetween(val a: Int, val b: Int) {
    return if((a < 15) && (b > 15)) true 
    else false
}

在性能方面,两种选择几乎相同。


这些答案可能会受到我的意见的影响。但我认为背后的原因或多或少。返回表达式的事实在读取代码时会产生直接影响。您知道该陈述的结果将是详尽无遗的,并且您拥有每个分支都已被处理的信息。

我认为这是一种最佳实践,因为在某些情况下,使分支条件穷尽可能会使编译器在忘记某些新条件时给出错误。不仅仅是密封课程。进一步阅读:https://proandroiddev.com/til-when-is-when-exhaustive-31d69f630a8b


2
投票

消息很清楚:

此检查通过提取退货或分配来报告if,when和try语句是否可以转换为表达式。

它说明了以下事实:

在Kotlin中,if是一个表达式,即它返回一个值。

你可以在这里找到更多:https://kotlinlang.org/docs/reference/control-flow.html#if-expression 在您的情况下,您可以返回如下结果:

return if((a < 15) && (b > 15)) true else false

所以这:

if((a < 15) && (b > 15)) true else false

是一个表达式,其值由return返回。

这个表达式可以进一步简化(但与你的问题无关):

return (a < 15) && (b > 15)

0
投票

在Kotlin中从java替换switch-operator时,但主要区别在于何时是表达式,因此它可以返回结果。为了更好地理解在Kotlin中使用when-expression的方法,你可以看一下lambdas。 when-operator只在每个case之后返回'lambda'的结果。

即使你写

when(a) {
    1 -> println("one")
    else -> println("something else")
}

此表示法返回函数println(...)的结果,返回Unit。因此,当您复制“return”时,它不是编写代码的最佳方式。

val result = when(a) {
    1 -> println("one")
    else -> println("something else")
}
// and now result equals to Unit-object

同样的故事是if-else,也就是表达。

© www.soinside.com 2019 - 2024. All rights reserved.