Builder Inference annotation

João Victor
Android Dev BR
Published in
3 min readFeb 22, 2021

Talvez você ainda não tenha escutado falar ou não sabe quando utilizar a anotação BuilderInference, eu mesmo via bastante nos códigos fontes da Google e sempre ignorava.

Hoje irei demonstrar o poder dessa anotação e o porque de ser constante utilizada em muitas bibliotecas.

Acredito que você em algum momento já escreveu alguma função genérica e gostaria que o tipo fosse automaticamente entendido pela IDE.

Olhe bem este exemplo

A IDE nos pede para especificar explicitamente o tipo da função listBuilder, ficando então assim:

Então não temos problemas, certo ?

Eu concordo em certo ponto !

Porém, olhe esse outro trecho de código

Isso acaba implicando na leitura do código, tornando mais confuso, seria muito mais limpo e mais rápido no nosso dia a dia se não precisamos de ter que em toda função de builder explicitar o tipo.

Vamos reparar alguns exemplos de funções já existentes na biblioteca do Android

Essa função tem como padrão de builder, repare como não precisamos escrever o tipo explicitamente, ficando mais simples e clara a implementação.

Como sabemos, o Kotlin vem sendo constantemente atualizado. Em uma atualização surgiu uma anotação bem interessante, essa anotação vem sendo utilizada em várias bibliotecas internas.

Vamos então ver o contrato dessa função e ver por que a IDE não reclama.

Damos aqui maior atenção ao argumento em destaque, repare que esse argumento tem a anotação que mencionei no logo no início do artigo.

A anotação BuilderInference, nos permite inferir tipos genéricos de uma função a partir das funções da interface genérica recebida no lambda.

Vamos então modificar nossa função listBuilder para que permita inferir argumentos também.

Repare que no contrato o argumento scope recebe uma interface do mesmo tipo da função.

e voilá!

Ressaltando a importância da interface recebida no lambda, temos que chamar métodos dela para a IDE entender o tipo genérico em questão !

Bônus !!

Lembre-se que a anotação está aberta para qualquer interface, nos permitindo várias possíbilidades, como por exemplo um construtor somente com função de adicionar:

Com nossa interface, podemos criar um contrato com escopo fechado para outras ações na lista.

Tendo mesmo resultado de adição que a interface mutável de listas do Kotlin !

Lembrando que essa anotação ainda está em experimental, então temos que adicionar a anotação

--

--