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

Allow !! when it is certain it will not throw an NPE

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

可空值本身确实永远不会为空。我想不出比 'It feels wrong'

更好的论据了
private val hasFinishedSubject = BehaviorSubject.create<Boolean>()

init {
    hasFinishedSubject.onNext(false)
}

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

由于 hasFinishedSubject 在构建时被初始化,hasFinishedSubject.value 永远不会为 null

可以换成f.i.:

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

但是这个 false 是多余的,也可能导致错误。什么最干净?

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

如果您可以控制这些注释,那么将这些注释包含在 BehaviorSubject class 中可能是有意义的。

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

从我的角度来看,应该避免在 Kotlin 代码中使用 !!,在 Kotlin 中有足够的方法让你的代码可以为空。

对于 Java 互操作 - 它可能会发生。但是,而不是使用 !! 一个人可能会使用一些更有意义的东西,就像你上面建议的那样。

我可能会这样写:

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

这里的error函数有return类型Nothing,实际上,它抛出一个异常。