Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

Learning Kotlin: The Lazy Delegate

DZone 's Guide to

Learning Kotlin: The Lazy Delegate

Want to learn more about using the Lazy delegate in Kotlin? Check out this tutorial to learn more about using the by operator and delegates in Kotlin.

· Java Zone ·
Free Resource

Following from our introduction to the by operator and delegates, this post looks at the first of five built-in delegates, lazy. Lazy property evaluation allows you to set the initial value of a property the first time you try to get it. This is really useful for scenarios where there is a high cost of getting the data. For example, if you want to set the value of a username, which requires a call to a microservice, but since you don't always need the username, you can use this to initial it when you try and retrieve it the first time.

Setting up the context for the example, let us look at two ways you can do this now. The first way is you call the service in the constructor, so you take the hit immediately — regardless if you ever need it. It is nice and clean though.

class User {
val name: String

constructor(id:Int){
// load service ... super expensive
Thread.sleep(1000)
name = "Robert"
}
}

fun main(args:Array<String>) {
val user = User(1)
println(user.name)
}


The second solution is to add a load function, so we need to call that to load the data. This gets rid of the performance hit, but it is less clean. If you forget to call load, your code is broken. You may think that will never happen to you, but I just did it while writing the sample code. It took me less than two minutes to forget I needed it. 

Another pain is I need to make my name property variable since it will be assigned at a later point.

class User(val id: Int) {
var name: String = ""

fun load() {
// load service ... super expensive
Thread.sleep(1000)
name = "Robert"
}
}

fun main(args:Array<String>) {
val user = User(1)
user.load()
println(user.name)
}


The solution to this is obviously lazy — this gives us the best of all of the above. It provides clean code and no performance hits unless I need it, in which case, I can use val  with none of the downsides.

class User(val id: Int) {
val name: String by lazy {
// load service ... super expensive
Thread.sleep(1000)
"Robert"
}
}

fun main(args:Array<String>) {
val user = User(1)
println(user.name)
}
Topics:
java ,kotlin ,tutorial ,delegate ,lazy delegate

Published at DZone with permission of

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}