允许!当确定不会抛出NPE时

时间:2019-02-15 10:12:18

标签: kotlin operator-keyword assertion non-nullable

我正在查看一个拉取请求,其中包含!!-非空的断言运算符。应该批准吗?

可为空的值本身实际上永远不会为空。我想不出比“感觉不对劲”更好的说法了

private val hasFinishedSubject = BehaviorSubject.create<Boolean>()

init {
    hasFinishedSubject.onNext(false)
}

val hasFinishedScanner: Boolean
    get() = hasFinishedSubject.value!!

由于hasFinishedSubject是在构造过程中初始化的,因此hasFinishedSubject.value永远不会为空

可以用f.i.代替:

val hasFinishedScanner: Boolean
    get() = hasFinishedSubject.value ?: false

,但此错误是多余的,并且也可能导致错误。最干净的是什么?

1 个答案:

答案 0 :(得分:0)

Kotlin编译器尊重Java的可空性注释,例如@Nullable@NotNull来自JSR-305或intelliJ。 https://kotlinlang.org/docs/reference/java-interop.html#nullability-annotations

如果可以控制,将这些注释包括在BehaviorSubject类中可能是有意义的。

另一方面,Kotlin中有一些平台类型,用于简化Java互操作中的可空性检查。 https://kotlinlang.org/docs/reference/java-interop.html#null-safety-and-platform-types

从我的角度来看,应该避免将!!与Kotlin代码一起使用,在Kotlin中,有足够的方法可以使您的代码为Nullable-correct。

对于Java互操作-可能会发生。但是除了使用!!以外,您还可以使用其他有意义的内容,例如您上面建议的内容。

我可能会写类似的东西:

val hasFinishedScanner: Boolean
    get() = hasFinishedSubject.value ?: error("No value")

error函数的返回类型为Nothing,实际上,它引发了异常。