Интервьюер: Каковы преимущества использования Kotlin для разработки приложений для Android?

Опрашиваемый: Котлин не безопасен.

Интервьюер: Хорошо. Почему?

Вышеупомянутый разговор мог произойти, если вы явились на собеседование с разработчиками Android в 2018/19 году.

User user = null;
user.setName("Vinay");

Все мы знаем, что произойдет, если приведенный выше код будет передан через сборку в руки пользователя. Тони Хоар признал в 2009 году, что пустая ссылка была его ошибкой на миллиард долларов.

Итак, что нам здесь делать?

User user = null;
if (user != null) {
   user.setName("Vinay");
}

Ага, все знают, как добавить нулевую проверку. Но в реальных приложениях нет только объекта User и LoginViewModel. И что? Мы добавляем нулевые проверки везде, где есть возможность NPE.

Что, если есть способ лучше, чем добавление нулевых проверок? Что, если сам язык сделает это за нас? Давайте посмотрим!

Типы, допускающие значение NULL, и типы, не допускающие NULL в Kotlin

val user : User = null

Приведенный выше код Kotlin выдаст вам ошибку компиляции (да, не во время выполнения): «Null не может быть значением пользователя ненулевого типа». Типы, не допускающие NULL, не позволят нам присвоить его значение null. Чтобы разрешить нулевое значение, мы должны использовать другой тип.

val user : User? = null

Проще говоря, Пользователь не может быть пустым и Пользователь? допускает значение NULL. Именно так компилятор kotlin понимает разницу между значением, не допускающим значения NULL, и значением NULL.

user.name = "Vinay"

Компилятор kotlin понимает, что вызов метода из nullable может вызывать NPE и, следовательно, дает ошибку компиляции: Разрешены только безопасные (?.) Или ненулевые утвержденные (!!.) Вызовы. получатель типа User, допускающий значение NULL?

user?.name = "Vinay"

Вот как вы проверяете null в Kotlin, просто добавляя «?».

Хорошо! Но у моего пользователя есть несколько свойств. Следует добавить "?" каждый раз при установке свойства объекта пользователя? Мне это не нравится! К счастью, есть способ получше. Если у вас есть блок кода, зависящий от ненулевого условия объекта, допускающего значение NULL, просто заключите этот блок в «? .Let»

user?.let {
    user.name = "Vinay"
    user.lastName = "Joglekar"
    user.city = "Mumbai"
}

Оператор Элвиса

Один из наиболее распространенных сценариев, когда у нас есть тип, допускающий значение NULL, - использовать значение, если оно не равно NULL, и значение по умолчанию, если в противном случае.

println(if (user?.city != null) user?.city else "Value is null")

Я создал переменную city, допускающую значение NULL. Я печатаю значение city, если оно не равно нулю, иначе я печатаю «Значение равно нулю». Kotlin предоставил оператора Elvis для таких ситуаций. Оператор Элвиса представлен вопросительным знаком, за которым следует двоеточие как ?:.

Используя оператор Элвиса, приведенный выше код можно просто записать так:

println(user?.city ?: "Value is null")

Знак «!!» оператор

Согласно официальной документации Котлина:

Оператор утверждения ненулевого значения (!!) преобразует любое значение в ненулевой тип и выдает исключение, если значение равно нулю.

user?.city = null
println(user?.city!!)

Вышеупомянутое вызовет исключение KotlinNullPointerException, поскольку компилятор kotlin выполняет интеллектуальное приведение из String? нанизывать.

Да, все еще существует возможность NPE в языке программирования Kotlin.

Используйте этот оператор, если переменная имеет тип, допускающий значение NULL, и вы на 100% уверены, что переменная не имеет значения NULL.

Заключение

Kotlin предоставляет множество опций, включая безопасный вызов, ? .Let блок, оператор Элвиса и, наконец, оператор утверждения. Используйте их осторожно и полностью используйте нулевую безопасность в своем коде.

С КОДИРОВКОЙ!