Ответ 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
}
Надеюсь, это поможет!