kotlin if (bar == null) vs. bar?: run

Вот образец

if (bar == null) { // do something } 

против

 bar ?: run { // do something. } 
  1. какой из них лучше?
  2. что такое мутирующая собственность?
  3. первый не работает с мутирующим свойством?

какой из них лучше?

Как отметил Оливер, намерение наиболее очевидно при использовании if(bar == null) . Это также подход, используемый в официальной документации Kotlin в разделе « Проверка нулевых условий» .

Хотя я не предлагаю этого в этом случае, Котлин позволяет вам делать такие вещи:

 inline fun whenNull(input: Any?, block: () -> Unit) { if(input == null) block() } 

Это позволит вам переписать if(bar == null) как:

 whenNull(bar) { // Do something } 

что такое мутирующая собственность?

Это переменная, значение которой может быть изменено. В принципе, переменная объявляется с использованием var и not val .

первый не работает с мутирующим свойством?

Это не имеет никакого отношения к вашему примеру, потому что вы проверяете if(bar == null) .

То, что вы имеете в виду, имеет значение, если вы проверяли, является if(bar != null) . В этом случае, если bar является var , Kotlin не может smart использовать его не нулевой тип, так как внутри тела, if значение bar может измениться в любое время. Это означает, что в теле, if вам нужно будет делать безопасные звонки на bar ( ?. ) Или использовать !! ,

Вы можете обойти это, выполнив следующие действия:

 val b = bar if(b != null) { // b has been smart cast to a non-null type } 

Kotlin способен к умному приведению b к непустому типу внутри тела if потому что он не изменен ( val ).

Кроме того, вы можете использовать безопасный вызов и let , который вызывает указанную функцию / блок с this значением в качестве аргумента и возвращает его результат. Учитывая безопасный вызов, this конечно, не пусто.

 bar?.let { // this is bar (non-null) }