Extension Functions em Kotlin: aplique melhorias ao framework Android sem se perder em classes *Util

Jefferson Tavares de Pádua
3 min readJul 3, 2017

--

Há algum tempo eu tenho usado a linguagem de programação Kotlin para desenvolver aplicativos Android e, após o suporte à linguagem ser oficializado na I/O 2017 é possível perceber que cada vez mais desenvolvedores estão adotando a linguagem, então gostaria de compartilhar algumas formas que o Kotlin facilita a minha vida como desenvolvedor.

Extension Functions

Extension Functions permitem a possibilidade de estender o comportamento de uma classe sem a necessidade de se criar uma subclasse. Isso é ótimo por que podemos adicionar novas funcionalidades até mesmo a classes finais como é o caso da classe java.util.String. Veja no exemplo abaixo como é possível adicionar nessa classe um método que permite uma validação simples de padrão de senha:

fun String.isValidaParaSenha() = 
this.matches("^[a-zA-Z0-9]+$") && this.length() >= 6
"123456".isValidaParaSenha() //false
"asdf12".isValidaParaSenha() //true

Nesse exemplo você já pode identificar algumas outras vantagens da linguagem Kotlin em relação ao Java, como por exemplo a não obrigatoriedade do uso de ponto e vírgula, além da possibilidade de definir uma função de uma linha tornando opcional a definição explícita do tipo de retorno, que nesse caso é um Boolean.

Como você pôde perceber, para definir uma Extension Function, basta preceder o nome da função a ser criada como o nome da classe que você deseja estender o comportamento, e o melhor, todos os métodos já existentes nessa classe poderão ser utilizados através da referência this.

Uma aplicação no mundo real

Muitas vezes as linguagens de programação disponibilizam funcionalidades que são realmente interessantes na teoria, mas que na prática nós, desenvolvedores, simplesmente não conseguimos encontrar uma aplicação, o que definitivamente não é o caso das Extension Functions. Veja o código abaixo, comum em momentos em que é necessário exibir um DialogFragment:

//MainActivity.ktLoginDialogFragment.newInstance().show(supportFragmentManager, "TAG")

Sempre que precisamos exibir um DialogFragment, precisamos passar como parâmetro uma instância de FragmentManager e uma String para que ele possa ser identificado. Em Kotlin, uma solução mais simples para esse problema seria a seguinte:

fun AppCompatActivity.showDialog(fragment: DialogFragment) { 
fragment.show(supportFragmentManager, "TAG")
}
//MainActivity.kt
showDialog(LoginDialogFragment.newInstance())

Como você pode perceber, o código presente na Activity se torna muito mais enxuto, mais fácil de ser lido, e consequentemente melhor de ser mantido. Você ainda poderia ir além, e forçar a presença de uma tag nos DialogFragments a serem passados como parâmetro, veja:

interface TaggedFragment {
val TAG: String
}
fun <T> AppCompatActivity.showDialog(fragment: T) where T : Tagged, T : DialogFragment {
fragment.show(supportFragmentManager, fragment.TAG)
}
//MainActivity.kt
showDialog(LoginDialogFragment.newInstance()) //LoginDialogFragment precisa implementar Tagged ou um erro será exibido durante a compilação

Essa versão torna o código ainda mais fácil de ser lido e mantido, uma vez que cada instância de DialogFragment poderá contar com sua tag única.

If you can dream it, you can do it. — Walt Disney

Essas são algumas das formas que o uso de Extension Functions tornam minha vida mais fácil como desenvolvedor usando a linguagem Kotlin. Caso tenha gostado dessa postagem, não se esqueça de recomendá-la para que outras pessoas também possam se beneficiar com a leitura. Se quiser aprender um pouco mais sobre a linguagem Kotlin com foco em desenvolvimento de aplicativos android, é só me seguir para acompanhar as próximas postagens.

Até a próxima.

--

--