Подтвердить что ты не робот

Как назначить нулевое значение переменной типа функции в Котлин?

У меня есть переменная, которая содержит обратный вызов, и по умолчанию значение должно быть нулевым. Но этот синтаксис не работает.

var callback1 : () -> Unit = null
var callback2 : ((a) -> c, b) -> Unit = null

Мое текущее решение - убедиться, что обратные вызовы имеют версии по умолчанию.

var callback1 : () -> Unit = { }
var callback2 : ((a) -> c, b) -> Unit = { a, b -> }

Это, однако, затрудняет проверку того, был ли установлен обратный вызов, и, возможно, реализация по умолчанию приносит некоторую стоимость (это так?). Как назначить пустое значение переменной типа функции в Kotlin?

4b9b3361

Ответ 1

Как и все переменные в Kotlin, ссылки на ссылки обычно не могут быть нулевыми. Чтобы разрешить нулевое значение, вы должны добавить ? в конец определения типа, например:

var callback1 : (() -> Unit)? = null
var callback2 : (((a) -> c, b) -> Unit)? = null

Обычно вам нужно скобки вокруг всего объявления типа функции. Даже если это не требуется, это, вероятно, хорошая идея. Вам также нужно будет вызвать функцию с помощью invoke с нулевым безопасным оператором:

callback1?.invoke()

В долгосрочной перспективе подход внедрения do-nothing, вероятно, более удобен, и мне кажется немного более "kotlin-y". Как и в большинстве случаев в области информатики, я бы не стал беспокоиться о стоимости исполнения реализации по умолчанию, если у вас нет конкретных данных о производительности, которые указывают на ее проблему.

Один из способов определить, был ли установлен обратный вызов без разрешения нулевых значений, заключается в использовании шаблона нулевого объекта :

val UNSET_CALLBACK1: () -> Unit = {}
var callback1 : () -> Unit = UNSET_CALLBACK1
fun callback1IsSet(): Boolean {
    return callback1 !== UNSET_CALLBACK1
}

Надеюсь, это поможет!