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

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

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

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

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

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

One Solution collect form web for “如何在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 } 

希望这可以帮助!

  • TextView Null膨胀父布局后
  • JUnit,@ControllerAdvice和缺少Kotlin中检查的异常
  • Kotlin为lambda生成内部类
  • Kotlin成员和扩展在同一时间
  • 在Kotlin阅读控制台输入
  • 为什么kotlin放弃“新”关键字?
  • 在哪里/如何为Kotlin软件包添加文档?
  • 与Kotlin事件总线不工作
  • 观点的含义:观点
  • Kotlin中有多个变量
  • Kotlin:检查是否已经初始化了val
  • Kotlin language will be the best programming language for Android.