Sobes.tech
Middle

Como funcionam as funções de extensão em Kotlin?

sobes.tech IA

Resposta da IA

As funções de extensão permitem adicionar novas funções às classes existentes sem herdar delas ou usar decoradores.

São declaradas usando um prefixo que indica o tipo que será estendido:

fun String.removeFirstChar(): String {
    // this refere-se ao objeto do tipo estendido (String)
    return this.substring(1)
}

Ao chamar a função de extensão, o compilador a transforma em um método estático, que recebe como primeiro argumento o objeto do tipo estendido:

// Chamada da função de extensão
val original = "Hello"
val modified = original.removeFirstChar()

// O compilador transforma a chamada aproximadamente assim:
// val modified = StringExtensionsKt.removeFirstChar(original) 

(Onde StringExtensionsKt é o nome da classe Kotlin gerada com métodos estáticos, se a função de extensão estiver fora de uma classe.)

As funções de extensão não modificam a própria classe. Elas apenas fornecem uma sintaxe mais legível para chamar métodos estáticos. Elas não têm acesso a membros privados ou protegidos da classe estendida.

A principal vantagem é um código mais legível, que imita a programação orientada a objetos, evitando problemas de herança.

Podem estender qualquer classe, incluindo bibliotecas padrão e classes Java. As funções de extensão podem ser membros de outra classe, nesse caso, são chamadas apenas dentro dessa classe.

Ao resolver sobrecargas e conflitos, a preferência é dada às funções membro da classe em relação às funções de extensão. Se houver várias funções de extensão com a mesma assinatura, aquela que for declarada localmente (no mesmo escopo) tem prioridade.