Kotlin Extension Functions — Novos horizontes para o Framework Android

Jefferson Tavares de Pádua
Android Dev BR
Published in
3 min readJan 19, 2018

Ainda que o Framework Android seja bastante completo, as particularidades de cada aplicação muitas vezes exigem a existência de funções auxiliares que fazem uso de métodos já existentes em uma determinada classe. Um exemplo básico seria a verificação do padrão de caracteres existentes em uma String.

Por ser uma classe final, é impossível criar uma subclasse de String. Na linguagem Java uma solução comum para esse tipo de situação é criar uma nova classe (StringsUtil) para alcançarmos o comportamento desejado, tal como no exemplo abaixo:

A principal desvantagem nesse tipo de aproximação está no fato de que muitas vezes essas classes acabam se tornando uma despensa para todo tipo de código que você não sabe onde colocar.

Outro problema é que na grande maioria das vezes, arquivos *Util violam o princípio da responsabilidade única (SRP), uma vez que dado o aninhamento de código, esse tipo de classe acaba por fazer mais de uma coisa.

A linguagem Kotlin, por sua vez, conta com a possibilidade de se criar “Extension Functions”, um recurso capaz de mitigar essas deficiências. O objetivo é te auxiliar nos primeiros passos para a adoção desse mecanismo. Vamos lá?!

Primeiramente é importante que você entenda que Extension Functions são funções que nos permitem adicionar novas funcionalidades a uma determinada classe, sem a necessidade de alterar seu código fonte ou de criar uma subclasse.

A principal vantagem de se utilizar esse recurso em comparação à criação de classes *Util está na melhor legibilidade do código, fator comumente associado à sua qualidade. Veja o exemplo abaixo:

Nesse caso, estamos criando o método putBooleanPreference, que é uma Extension Function da classe Context devido ao fato de ela estar sendo referenciada com um “.” antes do nome do método.

Essa função recebe dois parâmetros obrigatórios (key, value) e um parâmetro opcional (preferences) — caso nenhum valor seja passado para esse parâmetro, “usuario” será utilizado. É importante notar que o uso de argumentos padrão é encorajado pela linguagem como alternativa ao overload de métodos em Java.

No corpo dessa função, this (implícito na chamada ao método getSharedPreferences) é uma referência ao objeto em que o método foi invocado. Por essa razão podemos fazer chamadas a qualquer membro da classe Context como faríamos em uma subclasse.

Uma vez que criamos nossa Extension Function, é possível invocá-la em qualquer objeto da classe Context. Porém, como você deve imaginar, a função que acabamos de criar não altera o source code dessa classe, por isso fique sempre atento quanto à importação das funções utilizadas.

Tendo isso em mente, você pode realizar uma chamada à sua função da seguinte maneira:

Sim, isso mesmo! Sem nenhuma referência a qualquer outra classe você consegue fazer a chamada ao método criado como se ele fizesse parte do Framework. E o melhor, caso esteja trabalhando em um projeto Java/Kotlin, você pode fazer uso desse código seguindo o seu padrão Java. Para isso, basta adicionar a anotação @file:JvmName(“ContextUtil”) ao arquivo que contém sua função.

Caso esteja interessado em saber um pouco mais sobre esse recurso e ver alguns exemplos um pouco mais complexos esse gist contém algumas Extension Functions que criei em um projeto que estou trabalhando.

Até mais.

--

--