【问题标题】:Kotlin - universal method to check parameters for null [duplicate]Kotlin - 检查参数是否为空的通用方法
【发布时间】:2019-09-03 07:34:16
【问题描述】:

我正在使用Kotlin,并考虑编写通用方法来检查是否有任何传递的参数是not null

方法可以在if 语句中使用,而不是手动检查每个参数。如果参数不为空,那么编译器应该假设在if 语句中它们仍然是not null。示例如下:

fun getFoo(): Foo? {
  //return value
}

fun getBar(): Bar? {
  //return value
}

fun execute(foo: Foo, bar: Bar) {
  //do stuff
}

这是“传统”方式:

val foo = getFoo()
val bar = getBar()
if(foo != null && bar != null) {
  execute(foo, bar)
}

这就是我想做的:

fun isNotNull(vararg params: Any?): Boolean {
  return params.filterNotNull().isNotEmpty()
}

val foo = getFoo()
val bar = getBar()
if(isNotNull(foo, bar)) {
  execute(foo, bar)
}

当然上面的代码没有编译(Type mismatch, Required: Foo, Found: Foo?)。

有什么方法可以确保编译器已经检查了foobarnull?我可以在每个参数中使用!!,但这不是很优雅的解决方案。也许使用contract 进行一些构造?

当使用手动检查foo != null && bar != null时没有问题,因为自动smart castFooBar

【问题讨论】:

  • 尤其是评分为 115 的回答
  • @Eugene 看起来很有趣,我会检查的!谢谢

标签: kotlin kotlin-null-safety


【解决方案1】:

我不完全确定您为什么需要一个自定义函数。 kotlin null 安全性背后的想法是避免对这些方法的需求。一个简单的案例是使用let

fun m(foo: Foo?) {
  foo?.let {
      // it is not null here
  }
}

也就是说,如果需要这种方法,有一个新的实验性功能,称为合同,可以实现智能投射。你可以写一个这样的方法(我自己没试过,阅读更多关于它here

fun String?.isNullOrEmpty(): Boolean {
  contract {
    returns(false) implies (this@isNullOrEmpty != null)
  }
  return this == null || isEmpty()
}

这是为string 准备的,但我想可以为Any 这样做。我也认为这个特定的方法已经存在于标准库中。

再一次,我觉得这有点毫无意义,但至少这是可能的。您需要启用实验性功能。

【讨论】:

  • 这个想法是在条件检查中使用这个函数,我必须将多个参数传递给第 3 方库,并且所有参数都应该是 not null。手动执行此操作我必须编写 2 或 3 行 if 语句,其中我检查每个参数是 != null。我知道我可以使用?.let,但就像我说的有多个变量要检查。我尝试使用contract 写一些东西,但我没有任何经验,我真的不知道如何在我的方法中使用它。
  • 如果参数为空怎么办?您会因异常而使应用程序崩溃吗?如果是这样,那么只需使用!!。无需检查它们是否为空。运营商!! 将为您完成这项工作。更进一步,为什么甚至允许 null 呢?只需将您的方法声明为不接受空值即可。
猜你喜欢
  • 2014-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-03
相关资源
最近更新 更多