Android 在Kotlin中传递并使用函数作为构造函数参数
如何创建将函数作为构造函数参数的类。然后,在类中稍后的某个点使用此函数。您可以拥有一个函数类型的属性,就像您拥有任何其他类型的属性一样:Android 在Kotlin中传递并使用函数作为构造函数参数,android,kotlin,Android,Kotlin,如何创建将函数作为构造函数参数的类。然后,在类中稍后的某个点使用此函数。您可以拥有一个函数类型的属性,就像您拥有任何其他类型的属性一样: class A(val f: () -> Unit) { fun foo() { f() } } 从这里,您可以将该函数作为方法引用传递给构造函数: fun bar() { println("this is bar") } val a = A(::bar) a.foo() // th
class A(val f: () -> Unit) {
fun foo() {
f()
}
}
从这里,您可以将该函数作为方法引用传递给构造函数:
fun bar() {
println("this is bar")
}
val a = A(::bar)
a.foo() // this is bar
或者作为lambda:
val a = A({ println("this is the lambda") })
您甚至可以对lambda(函数的最后一个参数)执行常见的语法调整(尽管这有点疯狂):
如果有多个构造函数声明,则可以使用
...
private var listener : (() -> Unit)? = null
constructor(context: Context, listener: (() -> Unit)?) : this(context){
this.listener = listener
}
constructor(context: Context) : super(context, attrs = null)
...
在
SynchronizedLazyImpl
中可以看到一个真实的例子,该类支持lazy
委托
public fun <T> lazy(lock: Any?, initializer: () -> T): Lazy<T> =
SynchronizedLazyImpl(initializer, lock)
public-fun-lazy(锁:Any?,初始值设定项:()->T):lazy=
SynchronizedLazyImpl(初始化器,锁)
当我们通过lazy{…}使用val x时,作为lambda传递的初始值设定项
实际上存储为SynchronizedLazyImpl
实例中的一个属性,并在以后第一次访问相应的val x
时调用
public fun <T> lazy(lock: Any?, initializer: () -> T): Lazy<T> =
SynchronizedLazyImpl(initializer, lock)