DEV Community

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

Posted on

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:

Top comments (0)