Что вернется если обратиться к non-null сущности через оператор ?.
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Ответ
При обращении к non-null сущности через оператор безопасного вызова ?. в Kotlin, результат будет абсолютно идентичен обычному вызову через точку .. Ключевое отличие заключается в том, что оператор ?. предоставляет защиту от NullPointerException (NPE), проверяя, не является ли значение перед ним равным null. Если сущность гарантированно non-null, то проверка проходит успешно, и выполняется указанная операция.
Основное поведение
Оператор ?. действует по следующему принципу:
- Если значение слева
null→ возвращаетnullбез выполнения операции справа. - Если значение слева не
null→ выполняется операция справа, и возвращается её результат.
Для non-null сущности второй сценарий выполняется всегда. Пример:
val nonNullString: String = "Hello, World!"
val length = nonNullString?.length // Вызов через ?.
println(length) // Выведет: 13
Здесь nonNullString не может быть null, поэтому ?. работает как обычный оператор ., возвращая длину строки (13). NPE не возникает, так как проверка избыточна, но безопасна.
Практический пример с сравнением
Рассмотрим разницу между non-null и nullable переменными:
// Non-null переменная
val nonNull: String = "Kotlin"
val result1 = nonNull?.uppercase() // Результат: "KOTLIN"
// Эквивалентно nonNull.uppercase()
// Nullable переменная
val nullable: String? = null
val result2 = nullable?.uppercase() // Результат: null
// Вызова uppercase() не происходит, NPE избежали
Для nonNull использование ?. избыточно, но не ошибочно. В обоих случаях возвращается ожидаемый результат операции (например, преобразованная строка или null для nullable-переменной).
Важные нюансы
-
Тип результата: При использовании
?.с non-null сущностью, тип результата остаётся non-null, если только сама операция справа не возвращает nullable. Пример:val nonNull: String = "text" val length: Int? = nonNull?.length // Тип Int? (из-за ?.), хотя значение всегда Int // Лучше использовать nonNull.length для типа IntЗдесь компилятор выводит тип
Int?, так как оператор?.возвращает nullable-тип. Для non-null сущностей это может привести к нежелательной обёртке в nullable. -
Идиоматичное использование: В Kotlin для non-null переменных рекомендуется использовать прямой доступ через
.без?., чтобы избежать ненужных nullable-типов и упростить код. Оператор?.предназначен именно для nullable-переменных (String?,Int?и т.д.). -
Цепочки вызовов:
?.часто используется в цепочках для безопасного доступа к свойствам/методам. Для non-null сущностей это работает, но бесполезно:data class Person(val name: String, val age: Int) val person: Person = Person("Alice", 30) val nameLength = person?.name?.length // Избыточно, но вернёт 5
Вывод
- Возвращаемое значение: Для non-null сущности оператор
?.вернёт результат выполнения операции справа (например, значение свойства, результат метода). - Безопасность: NPE не возникнет, так как проверка на
nullпроходит успешно. - Рекомендация: Используйте
?.только для nullable-типов. Для non-null типов применяйте обычный доступ через., чтобы сохранить типобезопасность и чистоту кода. Оператор?.— это инструмент для работы с потенциальноnullзначениями, а не для всех вызовов.