Kotlin null проверяет (!!), когда обнуляемость уже проверена - PullRequest
0 голосов
/ 09 июля 2019

У меня вопрос по поводу Kotlin и предупреждений о его нулевых проверках.

Давайте предположим, что я создал объект под названием «пользователь» с некоторым атрибутом, таким как имя, фамилия и т. Д. И т. Д. Следующий код является примером:

if(user != null) {
    val name = user!!.name
    val surname = user.surname
    val phoneNumber = user.phoneNumber
} else 
    // Something else

Почему, даже если я проверил, что пользователь не нулевой, Kotlin хочет, чтобы я использовал !! в первый раз я звоню пользователю? В этот момент он не может быть нулевым.

Я знаю, что могу использовать следующий блок, но я не понимаю этого поведения.

user?.let{
    // Block when user is not null
}?:run{
    // Block when user is null
}

1 Ответ

4 голосов
/ 09 июля 2019

Есть причина для такого поведения.По сути, это потому, что компилятор не может гарантировать, что значение user не станет нулевым после проверки if.

Это поведение применимо только для var user, но не для val user.Так, например,

val user: User? = null;
if (user != null) {
  // user not null
  val name = user.name // won't show any errors
}
var user: User? = null;
if (user != null) {
  // user might be null
  // Since the value can be changed at any point inside the if block (or from another thread).
  val name = user.name // will show an error
}

let позволяет обеспечить неизменность даже для var переменных.let создает новое конечное значение отдельно от исходной переменной.

var user: User? = null
user?.let {
  //it == final non null user
  //If you try to access 'user' directly here, it will show error message,
  //since only 'it' is assured to be non null, 'user' is still volatile.
  val name = it.name // won't show any errors
  val surname = user.surname // will show an error
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...