假设我们有这样的代码:
class QuickExample {
fun function(argument: SomeOtherClass) {
if (argument.mutableProperty != null ) {
doSomething(argument.mutableProperty)
} else {
doOtherThing()
}
}
fun doSomething(argument: Object) {}
fun doOtherThing() {}
}
class SomeOtherClass {
var mutableProperty: Object? = null
}
与 Java 不同,在 Java 中,您可以独自担心运行时空取消引用,这不会编译 - 完全正确。当然,mutableProperty
一旦在“if”内,就不再为空。
我的问题是处理这个问题的最佳方法是什么?
有几个选项是显而易见的。在不使用任何新的 Kotlin 语言功能的情况下,最简单的方法显然是将值复制到随后不会更改的方法范围内。
有这个:
fun function(argument: SomeOtherClass) {
argument.mutableProperty?.let {
doSomething(it)
return
}
doOtherThing()
}
这有一个明显的缺点,您需要提前返回或以其他方式避免执行后续代码 - 在某些小型上下文中可以,但有味道。
那么就有这样一种可能:
fun function(argument: SomeOtherClass) {
argument.mutableProperty.let {
when {
it != null -> {
doSomething(it)
}
else -> {
doOtherThing()
}
}
}
}
尽管它的目的更加明确,但可以说它比 Java 风格的处理方式更加笨拙和冗长。
我是否遗漏了什么,是否有一个首选的习惯用法可以实现这一点?
Update:
正如弗兰塔在评论中提到的,如果该方法doSomething()
返回 null,然后将执行 elvis 运算符右侧的代码,这可能不是大多数人想要的情况。但同时,在这种情况下,很可能doSomething()
方法只会做一些事情,不会返回任何东西。
还有一种替代方案:正如 Protossor 在评论中提到的那样,also
可以使用而不是let
, 因为also
回报this
对象而不是功能块的结果。
mutableProperty?.also { doSomething(it) } ?: doOtherThing()
原答案:
我会用let
with 埃尔维斯操作员 https://kotlinlang.org/docs/reference/null-safety.html#elvis-operator.
mutableProperty?.let { doSomething(it) } ?: doOtherThing()
来自文档:
如果 ?: 左边的表达式不为 null,则 elvis 运算符
返回它,否则返回右侧的表达式。笔记
仅当左侧表达式成立时才计算右侧表达式
边为空。
对于右侧表达式之后的代码块:
mutableProperty?.let {
doSomething(it)
} ?: run {
doOtherThing()
doOtherThing()
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)