498просмотров
66.5%от подписчиков
26 февраля 2026 г.
📷 ФотоScore: 548
Контракты функций — как помочь компилятору Kotlin умеет делать smart cast после проверки if (x != null). Но если вы вынесли проверку в отдельную функцию — все ломается: fun String?.isValid(): Boolean = this != null && this.isNotBlank() fun process(s: String?) { if (s.isValid()) { s.length // ошибка: s всё ещё String? }
} Компилятор не знает, что isValid() == true гарантирует non-null. Контракты это исправляют: @OptIn(ExperimentalContracts::class)
fun String?.isValid(): Boolean { contract { returns(true) implies (this@isValid != null) } return this != null && this.isNotBlank()
} Теперь smart cast работает. Контракты полезны и для лямбд — можно указать, что лямбда вызывается ровно один раз (как в run, let), и тогда внутри неё можно инициализировать val. Стандартная библиотека использует контракты повсеместно. #mobilevk #kotlin