"Умные" преобразования в Kotlin

В этой заметке поговорим про Smart casts или "умные" преобразования.

При некоторых обстоятельствах можно проверить, существуют ли у nullable-типа какое-нибудь значение, кроме null. Если да, то появляется возможность использовать переменную так, как будто она не является null:

Из кода видно, что при использовании nullable-значения authorName отсутствуют восклицательные знаки. Такое использование nullable-проверок -- это пример smart cast либо умного преобразования типов.

Когда nullable-переменная содержит значение, то if-выражение выполняет 1-й блок кода, где Kotlin умным образом преобразует authorName к стандартному не-null типу String. Если же nullable-переменная не содержит значения (null), то выражение if будет выполнять блок else.

Следует отметить, что применение smart cast считается более безопасным, чем утверждение не-null значения посредством оператора !!. При этом лучше задействовать smart cast всегда, когда у nullable-типа значение может быть null. Ну а утверждение не-null значения подойдет лишь в одном случае -- когда nullable гарантированно содержит значение.

Кроме вышесказанного, применение smart cast будет полезным, когда nullable проверен и не будет после этого меняться. Например, когда nullable присваивается переменной, неизменяемой как после умного преобразования, так и перед использованием либо после присвоения константе.

Собственно говоря, знание этих нюансов позволит вам безопасно заглядывать внутрь nullable-типа и извлекать значения, если они там присутствуют.

По материалам https://kotlins.org/null.