Kotlin:编码讨论:检查多个可能为空的变量的优雅方法

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

我使用 Kotlin 来编写 Android 应用程序。为了空指针安全,需要检查所有引用是否都是非空的。然而,如果只有一个为空,那么我们应该通知用户出了问题。

以简洁易读的方式进行编程对我来说很重要。

我正在寻找一个简短且易于理解的解决方案。

标准方法是:

if  (b != null && a != null && c !=null ...) println ("everything ok.")
else println("Something went wrong")
kotlin null
2个回答
17
投票

这里有一个简洁的条件写法:

listOf(a, b, c).any { it == null }

在上下文中,您可以这样使用它:

println(if (listOf(a, b).any { it == null })) "Something went wrong"
        else "Everything ok.")

3
投票

您可以使用 Elvis 运算符

?:
,它允许在值为 null 的情况下提供默认值(包括从函数返回)。

例如:

fun foo(a: Int?, b: String?, c: Boolean?) : String? {
    a ?: return null
    b ?: return null
    c ?: return null
    return "Everything ok."
}

这种方法的优点是,根据哪个值为空,您可能会得到不同的错误结果:

  • 使用异常:

    fun foo(a: Int?, b: String?, c: Boolean?) : String {
        a ?: throw IllegalArgumentException("a is null")
        b ?: throw IllegalArgumentException("b is null")
        c ?: throw IllegalArgumentException("c is null")
        return "Everything ok."
    }
    
  • 使用不同的返回值:

    fun foo(a: Int?, b: String?, c: Boolean?) : Result {
        a ?: return Result.ErrANull
        b ?: return Result.ErrBNull
        c ?: return Result.ErrCNull
        return Result.OK("Everything ok.")
    }
    
    sealed class Result {
        class OK(val s: String) : Result()
        object ErrANull : Result()
        object ErrBNull : Result()
        object ErrCNull : Result()
    }
    
© www.soinside.com 2019 - 2024. All rights reserved.