DEV Community

Cover image for Interfaces em Kotlin
Ronaldo Costa de Freitas
Ronaldo Costa de Freitas

Posted on

3

Interfaces em Kotlin

Hoje vamos nos aprofundar no entendimento de Programação Orientada a Objetos em Kotlin, veremos como a linguagem lida com interfaces e suas diferenças em relação a Java. As interfaces de Kotlin se diferenciam da sua equivalente em Java. Em Kotlin, as interfaces podem conter declarações de propriedades, por exemplo, algo que não ocorre em Java.

Similarmente a Java, elas podem conter definições de métodos abstratos assim como definições de métodos não abstratos, mas elas não podem conter nenhum estado.

interface Clickable {
    fun click()
}
Enter fullscreen mode Exit fullscreen mode

Para criar um interface usamos a palavra-chave interface, seguida de seu nome e chaves. No exemplo acima temos uma interface chamada Clickable que contém a definição de um método abstrato chamado click(). Qualquer classe não abstrata que implemente essa interface será obrigada a implementar esse método:

class Button : Clickable {
    override fun click() = println("I was clicked")
}
Enter fullscreen mode Exit fullscreen mode
>>> Button().click()
I was clicked
Enter fullscreen mode Exit fullscreen mode

A classe desenvolvida acima Button implementa a interface Clickable (indicado pelos :, que substituem ambas as palavras-chave implements e extends de Java) e sobrescreve o método click(). Essa sobrescrita foi indicada pelo modificador override que é obrigatório em Kotlin, diferentemente de Java.

Como dito anteriormente, as interfaces tanto em Kotlin quanto em Java podem ter definições de métodos não abstratos, com a diferença que a notação default não é necessária:

Kotlin:

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

Java 8:

interface Clickable {
    void click();
    default void showOff() {
        System.out.println("I'm clickable!")
    }
}
Enter fullscreen mode Exit fullscreen mode

Implementando propriedades declaradas em interfaces

Se uma interface declarou uma ou mais propriedades, todas as classes que a implementam devem dar algum jeito de obter o valor dessa ou dessas propriedades.

Interface User:

interface User {
    val nickname: String
}
Enter fullscreen mode Exit fullscreen mode

Vamos observar três possíveis formas de se inicializar a propriedade nickname da interface User em três classes que a implementam: PrivateUser, SubscribingUser e FacebookUser:

class PrivateUser(override val nickname: String) : User

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

class FacebookUser(val accountId: Int) : User {
    override val nickname = getFacebookName(accountId)
}
Enter fullscreen mode Exit fullscreen mode

A primeira classe PrivateUser diz que o valor da propriedade será passado no construtor primário dela mesma, a classe SubscribingUser desenvolve um getter customizado para obter o valor da propriedade e, por fim, a classe FacebookUser apenas inicializa a propriedade de cara. Note que todas as implementações da propriedade foram marcadas com o modificador override.

As interfaces em Kotlin também podem conter getters e setters, mas não podem armazenar dados, visto que isso seria armazenar um estado, o que não é permitido como já dito. Vamos ver um exemplo:

interface User {
    val email: String
    val nickname: String
        get() = email.substringBefore('@')
}
Enter fullscreen mode Exit fullscreen mode

Podemos ver que o valor da propriedade não é armazenado na interface, mas sim calculado todas as vezes que ela é implementada.

Fonte

O post de hoje foi baseado totalmente no incrível e conciso capítulo 4 de Kotlin in Action de Dmitry Jemerov e Svetlana Isakova. Confira o material original para maior entendimento de interfaces na nossa querida linguagem Kotlin.

Próximos posts

Nos próximos post vamos finalizar nossos estudo em Kotlin entendendo como a linguagem lida com classes e objetos. Obrigado pela atenção e até a próxima!

Post anterior:

Sentry mobile image

App store rankings love fast apps - mobile vitals can help you get there

Slow startup times, UI hangs, and frozen frames frustrate users—but they’re also fixable. Mobile Vitals help you measure and understand these performance issues so you can optimize your app’s speed and responsiveness. Learn how to use them to reduce friction and improve user experience.

Read full post →

Top comments (0)

Sentry mobile image

Mobile Vitals: A first step to Faster Apps

Slow startup times, UI hangs, and frozen frames frustrate users—but they’re also fixable. Mobile Vitals help you measure and understand these performance issues so you can optimize your app’s speed and responsiveness. Learn how to use them to reduce friction and improve user experience.

Read the guide

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay