Property Delegates
In other words, let’s find out more about how to be lazy!
A Refresher on lazy
Back in the chapter on properties, we saw by lazy
syntax:
class Foo(val rawLabel: String) {
var count = 0
val label: String by lazy { println("initializing via lazy!"); rawLabel.toUpperCase() }
fun something() {
count += 1
println("$label: something() was called $count times")
}
}
fun main() {
val foo = Foo("foo")
foo.something()
foo.something()
foo.something()
println("the final count was ${foo.count}")
}
Here, label
is computed lazily. If the code were:
val label = rawLabel.toUpperCase()
…then label
would be populated immediately. Instead, by lazy
will evaluate the supplied lambda expression when label
is first accessed.
In this particular example, there is no practical difference, since rawLabel
is a val
property and will not change during the lifetime of label
, and we are always accessing label
. However, by lazy
is useful if:
- The initialization might not be needed, and
- The initialization is a bit expensive
Prev Table of Contents Next
This book is licensed under the Creative Commons Attribution-ShareAlike 4.0 International license.