2017-07-04 3 views

Antwort

6

Sie können eine Eigenschaft mit einem Funktionstyp haben wie Sie mit jeder anderen Art würde:

class A(val f:() -> Unit) { 

    fun foo() { 
     f() 
    } 

} 

Von hier aus, können Sie diese Funktion an den Konstruktor als Methode Referenz übergeben können:

fun bar() { 
    println("this is bar") 
} 

val a = A(::bar) 
a.foo()    // this is bar 

Oder als Lambda:

val a = A({ println("this is the lambda") }) 

Und Sie können sogar den üblichen syntaktischen Zucker für lam tun BDAs, dass der letzte Parameter einer Funktion ist (obwohl dies ein wenig wild bekommen):

val a = A { println("this is the lambda") } 
0

Wenn Sie mehr als eine Konstruktor Erklärungen haben, können Sie diese Ein Beispiel aus der Praxis

... 

private var listener : (() -> Unit)? = null 

constructor(context: Context, listener: (() -> Unit)?) : this(context){ 
     this.listener = listener 
} 

constructor(context: Context) : super(context, attrs = null) 

... 
1

können verwenden in SynchronizedLazyImpl beobachtet werden, die Klassenunterstützung lazy Delegierten.

public fun <T> lazy(lock: Any?, initializer:() -> T): Lazy<T> = 
    SynchronizedLazyImpl(initializer, lock) 

Wenn wir val x by lazy {...} verwenden, wird die initializer, als Lambda geleitet, tatsächlich als eine Eigenschaft in einer Instanz von SynchronizedLazyImpl gespeichert und später, wenn die entsprechenden val x genannt wird zum ersten Mal zugegriffen wird.

Verwandte Themen