Article image Interfaces in Kotlin

10. Interfaces in Kotlin

Page 10 | Listen in audio

In Kotlin, interfaces play a crucial role in defining the contract for classes, allowing developers to specify what methods a class should implement without dictating how they should do so. This is particularly useful in Android app development, where modularity and flexibility are key to building scalable applications.

Unlike abstract classes, interfaces in Kotlin can contain abstract methods as well as method implementations. This is a significant departure from Java, where interfaces can only contain abstract methods (prior to Java 8). In Kotlin, interfaces can have properties and can also provide default implementations for methods, which makes them highly versatile.

Defining an Interface

To define an interface in Kotlin, you use the interface keyword. Here’s a simple example:

interface Clickable {
    fun click()
    fun showOff() = println("I'm clickable!")
}

In this example, the Clickable interface declares an abstract method click() and a method showOff() with a default implementation. Any class that implements this interface will need to provide an implementation for click(), but it can use the default implementation of showOff() or override it.

Implementing Interfaces

To implement an interface in a class, you use the : symbol followed by the interface name. Here’s an example:

class Button : Clickable {
    override fun click() {
        println("Button clicked")
    }
}

In this example, the Button class implements the Clickable interface. It provides an implementation for the click() method. The showOff() method can be used as is, or it can be overridden if desired:

class Button : Clickable {
    override fun click() {
        println("Button clicked")
    }

    override fun showOff() {
        println("I'm a button and I'm clickable!")
    }
}

Multiple Interfaces

Kotlin allows a class to implement multiple interfaces, which is a powerful feature for creating flexible and reusable components. Here’s how you can do it:

interface Focusable {
    fun setFocus(b: Boolean) = println("I ${if (b) "got" else "lost"} focus.")
}

class Button : Clickable, Focusable {
    override fun click() {
        println("Button clicked")
    }

    override fun showOff() {
        println("I'm a button and I'm clickable and focusable!")
    }
}

In this example, the Button class implements both the Clickable and Focusable interfaces. It provides an implementation for the click() method and overrides the showOff() method from the Clickable interface. The setFocus() method from the Focusable interface is used as is.

Interface Properties

Interfaces in Kotlin can also contain properties. These properties can either be abstract or have accessor implementations. Here’s an example:

interface User {
    val nickname: String
    val email: String
        get() = "[email protected]"
}

class PrivateUser(override val nickname: String) : User

class SubscribingUser(val emailAddress: String) : User {
    override val nickname: String
        get() = emailAddress.substringBefore('@')
}

In this example, the User interface declares a property nickname without an accessor implementation, making it abstract. It also declares a property email with a default accessor implementation. The PrivateUser class provides its own implementation for nickname, while the SubscribingUser class provides a custom implementation for nickname and uses the default implementation for email.

Resolving Interface Conflicts

When a class implements multiple interfaces that have methods with the same signature, you need to explicitly specify which implementation to use. This is done using the super keyword. Here’s an example:

interface A {
    fun showOff() = println("I'm A!")
}

interface B {
    fun showOff() = println("I'm B!")
}

class C : A, B {
    override fun showOff() {
        super.showOff()
        super.showOff()
    }
}

In this example, both interfaces A and B have a method showOff(). The class C implements both interfaces and resolves the conflict by explicitly specifying which showOff() method to call using super<InterfaceName>.

Practical Use in Android Development

In Android app development, interfaces are often used to define callbacks and listeners. For instance, you might create an interface to handle user interactions with a UI component:

interface OnItemClickListener {
    fun onItemClick(position: Int)
}

class MyAdapter(private val listener: OnItemClickListener) : RecyclerView.Adapter() {
    // Adapter implementation
}

In this example, the OnItemClickListener interface defines a single method onItemClick(). The MyAdapter class takes an instance of this interface as a parameter, allowing the caller to handle item click events in a RecyclerView.

By using interfaces, you can decouple components, making your code more modular and easier to maintain. This pattern is prevalent in Android development, where activities and fragments often implement listener interfaces to respond to events from UI components like buttons and list items.

Conclusion

Interfaces in Kotlin provide a powerful tool for defining contracts in your code, allowing you to create flexible and reusable components. With the ability to include both abstract methods and default implementations, Kotlin interfaces offer a level of versatility not found in traditional Java interfaces. This makes them particularly useful in Android app development, where modularity and flexibility are essential for building scalable applications.

By understanding and leveraging interfaces, you can create more robust and maintainable Android applications, ensuring that your codebase remains clean and adaptable to future changes.

Now answer the exercise about the content:

What is one key difference between interfaces in Kotlin and interfaces in Java prior to Java 8?

You are right! Congratulations, now go to the next page

You missed! Try again.

Article image Kotlin Data Classes

Next page of the Free Ebook:

11Kotlin Data Classes

6 minutes

Earn your Certificate for this Course for Free! by downloading the Cursa app and reading the ebook there. Available on Google Play or App Store!

Get it on Google Play Get it on App Store

+ 6.5 million
students

Free and Valid
Certificate with QR Code

48 thousand free
exercises

4.8/5 rating in
app stores

Free courses in
video, audio and text