Extension functions em Kotlin

16/4/2019
William Okano
Back-end Developer

Apaixonado por desenvolvimento, mas não dispensa comidas deliciosas e oportunidades de dormir.

Kotlin provê a habilidade de estender uma classe com novas funcionalidades sem ter que trabalhar com heranças e/ou se utilizar de algum padrão do tipo Decorator. E para tal, isso é feito por uma declaração especial chamada de extensions. Kotlin provê suporte tanto para extension functions e extensions properties.sw

Motivação do uso de extension functions e extension properties

Assim como “quase” toda funcionalidade de uma linguagem, extensions em Kotlin é utilizado para aumentar a “expressividade” da linguagem, aumentando assim a legibilidade do código.

Toda extension, seja ela function ou property, tem sempre um “receptor”. Quando falamos de receptor, ou receiver, estamos falando em quem estaremos aplicando a extensão. No conceito de extensions, o receptor será sempre uma referência ao this.

Extension functions

Uma função de extensão, assim como seu nome diz, é uma função onde podemos estender uma classe sem necessariamente mexer em sua declaração. Isso é possível pois no fundo todas as funções de extensão são resolvidas estaticamente.

Para declarar uma extension function é necessário prefixar uma função com um tipo receptor. Um exemplo bem simples é uma função que dobra o valor de um inteiro. Neste exemplo, this será uma referência para o número 10.

<p>CODE: https://gist.githubusercontent.com/williamokano/8c965d7ec05bddb623d37712c5a43205.js</p>

Como utilizar extension functions para melhorar a legibilidade de um código? Vamos supor que temos uma lista funcionários que irão receber uma ajuda de custo. Todos os funcionários que recebem menos de R$ 1.000,00 irão receber uma ajuda de custo baseado no número de filhos que ele possui, sendo R$ 100,00 por filho.

Um código para expressar esse problema em Kotlin seria algo do tipo

<p>CODE: https://gist.githubusercontent.com/williamokano/e27b59dc5671118a9b8cfa65f5bb5f46.js</p>

O mesmo código poderia ser reescrito com o auxílio de extension functions mais ou menos assim:

<p>CODE: https://gist.githubusercontent.com/williamokano/a8bcce67012f26f7b4136cf955ad5206.js</p>

Extension properties

Extensão de propriedades é muito similar à extensão de métodos, com a diferença de quem ao invés de uma função, é estendido (ou criada) uma propriedade.

A forma de declarar uma extension property é dada pela sintaxe abaixo:

<p>CODE: https://gist.githubusercontent.com/williamokano/781494393f9f7ed13c63ce63ac50c605.js</p>

Um exemplo bem interessante que vi recentemente foi a utilização de extension properties para realizar conversões.

<p>CODE: https://gist.githubusercontent.com/williamokano/8831fce810d16d1d929118ad45753039.js</p>

‘Tá, esse não é o melhor exemplo, Kotlin já te da suporte para conversões para BigDecimal, e provelmente seria mais “idiomático” utilizar extension function ao invés de property, e que os deuses do clean code me perdoem, mas BD é um nome muito ruim.

newsletter da zup

Semi pro tip

Uma coisa que pode rapidamente sair de controle, é ter extensions functions pra todo canto do projeto. A intenção é aumentar a legibilidade, mas claro que não queremos de forma alguma diminuir a manutenibilidade do projeto, portanto algumas dicas pessoais sobre o uso de extensions functions:

- Crie um helper para seus extensions. Caso tenha muitas classes, tente manter um helper para um conjunto, ou até individualmente, seus extensions;

- Visibilidade: caso seu extension seja apenas local, opte por utilizar modificadores de visibilidade, como private, ou criar a extension apenas com escopo local;

- Em Kotlin você não é obrigado a ter uma classe para tudo, como em Java, então pode ser uma boa ideia deixar suas extensions como “Top-level functions”, ou seja, funções que não estão definidas em uma classe.

Quer se aprofundar?

Esse artigo tem o objetivo apenas de introduzir o conceito de extensões. Caso queira se aprofundar em extensions, seja functions ou properties, você pode ver por aqui a própria documentação do Kotlin (versão em Inglês).

O que você achou deste conteúdo?
Quer receber nossos conteúdos?
Seu cadastro foi efetuado com sucesso! Enviaremos as novidades no seu email.
Oops! Something went wrong while submitting the form.