Kotlin Delegation Functions

Enhance Your Code's Modularity and Reusability

Kotlin Delegation Functions

Discover the power of Kotlin delegation functions, a versatile feature that allows you to delegate operations between objects, implement interfaces, and manage resources efficiently.

In this article, we'll explore the benefits of using delegation functions in your Kotlin projects and provide practical examples to demonstrate their usage.

In Kotlin, a delegation function allows one object to delegate certain operations to another object.

For example, let's say you have two classes: ClassA and ClassB. ClassB wants to use some of the functionality of ClassA without inheriting from it. This is where delegation comes in.

Instead of ClassB inheriting from ClassA, it can delegate the functionality it needs to an instance of ClassA. This is done using the by keyword.


Here's an example:

class ClassA {
    fun someFunction() {
        println("Hello from ClassA")
    }
}

class ClassB(a: ClassA) {
    private val classA = a

    fun callSomeFunction() {
        classA.someFunction()
    }
}

In this example, ClassB is delegating the someFunction() operation to an instance of ClassA.

We create an instance of ClassA and pass it to ClassB's constructor. ClassB stores this instance in a private variable called classA.

Then, ClassB has a function called callSomeFunction() which calls someFunction() on the classA instance.

We can simplify this code by using the by keyword to delegate the functionality:

class ClassB(a: ClassA) by a {
    fun callSomeFunction() {
        someFunction()
    }
}

In this version, we're saying that ClassB will delegate all of its functions and properties to an instance of ClassA. We don't need to store the instance in a variable or call someFunction() using the classA variable. Instead, we can call it directly with someFunction().


Another Example: Delegating interface implementation

if we have an interface called MyInterface, we can create a class that implements this interface and then delegate its implementation to another object. This can be done using the by keyword and passing in the object that we want to delegate to. Here's an example:

interface MyInterface {
  fun doSomething()
}

class MyInterfaceImpl : MyInterface {
  override fun doSomething() {
    println("Doing something...")
  }
}

class MyClass : MyInterface by MyInterfaceImpl()

fun main() {
  val obj = MyClass()
  obj.doSomething() // output: "Doing something..."
}

In this example, we have an interface called MyInterface and a class called MyInterfaceImpl that implements it. We then create a class called MyClass and delegate its implementation of MyInterface to MyInterfaceImpl using the by keyword.

When we create an instance of MyClass and call doSomething(), it delegates the call to the MyInterfaceImpl object and prints "Doing something..." to the console.

Use Cases :

  • Implementing interfaces: Kotlin delegation allows you to implement interfaces without implementing all of their methods. You can create a separate class that implements the interface and then delegate the implementation of the interface methods to that class.

  • Property delegation: Kotlin delegation allows you to delegate property access to a separate object, which can handle getting and setting the property values. This can be useful for implementing lazy properties, observable properties, and properties that need to be initialized dynamically.

  • Resource management: Kotlin delegation can be used for resource management, such as closing database connections or file handles when they are no longer needed. You can create a separate class that handles the resource management and delegate to it the class that uses the resources.

  • Decorator pattern: Kotlin delegation can be used to implement the decorator pattern, where you have a base class and one or more decorator classes that add functionality to the base class. You can use delegation to delegate the base class functionality to the decorator classes.

  • Dependency injection: Kotlin delegation can be used for dependency injection, where you create a separate class that provides the dependencies and then delegate to it in the class that needs the dependencies. This can help to reduce coupling between classes and make your code more modular.

These are just a few examples of how Kotlin delegation can be used. It's a powerful feature that can help to make your code more modular and reusable.


That's all for now. If you enjoyed this article, please give it a thumbs-up and subscribe to my newsletter for more.

Did you find this article valuable?

Support Satyajit Das by becoming a sponsor. Any amount is appreciated!