Предположим, что у нас есть этот код:
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, где вас можно оставить в покое, чтобы беспокоиться о нулевой разыменовании во время выполнения, это не компилируется - совершенно правильно. Конечно, mutableProperty
больше не может иметь значение null в "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-стиля с этим.
Я что-то упускаю, и есть ли предпочтительная идиома для этого?