One of the patterns that is super integrated in Kotlin is the delegation pattern. It helps the developer to reuse code easily and keep the readability of the language elegant and simple.

If you’ve been writing Kotlin code for some time, you’ve probably seen the by lazy expression.

The lazy delegate provides a setter and a getter, but in this case, it works so that the variable is only computed once. After that, the value is only passed around when readed, because the computed value is maintained in memory.

At the end of the day, what this delegate is doing is giving the responsibility of providing a getter and a setter to another class, using the keyword by.

Implementing a custom delegate

My favorite use case for custom delegates comes when working with LiveData. The idea is that the content store in the LiveData object could be accessed without using the value variable to read or write its content.

Normally, we would have something like this.

A traditional way of using LiveData

Here, the MutableLiveData is hidden so that it can only be accessed from the ViewModel, and the LiveDataobject is exposed. Each time we need to modify its content we need to use the variable with the underscore (which in my opinion looks ugly), and then read or write over the value property.

We are going to use delegates to avoid this. To start, we need a class that is going to take the responsibility we talk about before, this is the one to which we are going to delegate the getter and setter.

In this class, we need to override the operators getValueand setValue, so that they write or read the value contained in the LiveDataobject.

LiveData delegate

And now using the class that we’ve created before, we can use it to delegate the getter and setter of the LiveData object, and access it in a cleaner way, like in the following example.

Using the LiveData delegate

It may seem like a small change, but once you’ve written this code thousands of times, you start to appreciate it.

I also have an article where I talk about Kotlin reified and the inline keyword, in case you are interested in the topic. You can find it here.

Bonus tip

If you use map objects, you can populate a class with them in a more semantic way using delegates, instead of using custom solutions like, for example, loops.

For that, you need to define class like so.

Object population with map

The technology is still new and evolving. There are some projects to share also the UI code using Compose, but this is something that I’ve not tried out, and I don’t want to dive into it.

And then, when you are populating the class, the keys must have the same value as the name of the class property, like this.

Creating an instance that is populated with a map

If you want to read more content like this without ads and support me, don’t forget to check my profile, or give Medium a chance by becoming a member to access unlimited stories from me and other writers. It’s only $5 a month and if you use this link I get a small commission.

Featured image by AbsolutVision on Unsplash

Categorized in: