允许 !!当确定它不会抛出 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
或 @NotNull
。
https://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
,实际上,它抛出一个异常。
我正在查看一个拉取请求,其中包含 !!
- 非空断言运算符。应该批准吗?
可空值本身确实永远不会为空。我想不出比 '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
或 @NotNull
。
https://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
,实际上,它抛出一个异常。