如何在Kotlin中为函数类型变量赋一个空值?

我有一个持有回调的变量,默认情况下,它的值应该为空。 但是这个语法似乎不起作用。

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

我目前的解决方案是确保回调有默认的实现。

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

然而,这使得很难检查回调是否被设置,并且可能的默认实现有一些代价(是这样的?)。 如何在Kotlin中为函数类型变量赋一个空值?

像Kotlin中的所有变量一样,函数引用通常不能为空。 为了允许空值,你必须添加一个? 到类型定义的末尾,如下所示:

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

通常在整个函数类型声明中都需要括号。 即使这不是必需的,这可能是一个好主意。 您还需要使用invoke null安全的运算符来调用该函数:

 callback1?.invoke() 

从长远来看,无所作为的实施方式可能更为方便,而且对我来说似乎更为“科学”。 和大多数计算机科学一样,我不担心默认实现的性能成本,除非你有具体的性能数据表明这是一个问题。

确定回调是否设置为不允许空值的一种方法是使用空对象模式 :

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

希望这可以帮助!