Utilizando features do Java 8 no Android

Utilizando features do Java 8 no Android
Alex Felipe
Alex Felipe

Compartilhe

Se você é um desenvolvedor Android experiente, não é novidade que o SDK do Android não opera com as versões mais recentes do Java, em específico, atualmente temos 100% de compatibilidade com a versão 7 do Java.

Isso significa que as features legais que temos no Java 8 ou mais, por padrão, não estão disponíveis!

Como uma alternativa, a própria comunidade desenvolveu libs capazes de trazer um pouco da experiência do Java 8 no Android, como é o caso do Retrolamba que permite o uso de expressão lambda para interfaces funcionais (Single Abstraction Method).

Jack toolchain e o desugar

Com base no interesse da comunidade, a própria equipe da Google disponibilizou o Jack (Java Android Compiler Kit), também conhecida como Jack toolchain, como uma alternativa experimental, para possibilitar algumas features do Java 8 'nativamente'.

Mesmo tendo uma proposta boa, a configuração via Jack toolchain não era das melhores, como também, haviam outros impactos que o depreciaram :(

Então, a partir da versão 3.0 do Android Studio, a Google otimizou essa solução adicionando uma etapa a mais na transformação de bytecode chamada desugar:

O desugar opera logo depois do código ser compilado pelo próprio compilador do Java, possibilitando o uso das features do Java 8 mesmo tendo a limitação de versão.

Banner da Escola de Mobile: Matricula-se na escola de Mobile. Junte-se a uma comunidade de mais de 500 mil estudantes. Na Alura você tem acesso a todos os cursos em uma única assinatura; tem novos lançamentos a cada semana; desafios práticos. Clique e saiba mais!

Habilitando o Java 8 de maneira

Para habilitar as features do Java 8 com o desugar, precisamos apenas adicionar o seguinte script no arquivo de build do módulo:


android { // demais configs

compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } }

Pronto, somos capazes de usar as features do Java 8 disponibilizadas.

"Legal, mas em quais situações posso usufruir das features do Java 8?"

A mais comum está relacionada às interfaces funcionais, como é o caso de listeners, por exemplo, um listener de clique com expressão lambda fica da seguinte maneira:


botao.setOnClickListener(v -> {
// implementação do clique
});

Comparando com a maneira 'tradicional':


botao.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    // implementação do clique
    }
});

Bem mais simple, né?

Limitações com o uso do Java 8

Entretanto, nem todas as features estão acessíveis para qualquer versão de SDK do Android, mas não fique triste, abaixo estão as features disponíveis em quaisquer versões:

Da mesma forma, existem outras APIs, como é caso da classe Stream, que só são suportadas quando utilizamos a versão 24 como SDK mínimo. Outro caso são as classes do pacote java.time que exige a API 26.

De qualquer forma, é possível verificar os pacotes acessíveis diretamente pela documentação do Android. Agora vem a questão:

Vale a pena habilitar o uso do Java 8 no ambiente Android?

Caso o seu objetivo são features são suportadas por todas versões de SDK do seu projeto, faz muito sentido usufruir do Java 8.

Agora, se tiver que modificar o suporte mínimo, não é recomendável a mudança, afinal, você vai deixar de atender mais usuários por algo que não trás tanto valor para o produto final.

"Puts, eu queria muito ter acesso à API do Stream ou LocalDate, mas não posso aumentar o suporte mínimo do SDK, e agora?"

Existem algumas libs que podem ser adicionadas, como é o caso da Lightweight-Stream-API e a joda-time. É importante ressaltar que elas possuem uma interface similar às do Java, mas a implementação pode ter diferenças, como a ausência de processamento paralelo.

Abrindo portas para o Kotlin

Muito provavelmente, você já ouviu falar sobre a linguagem Kotlin para desenvolver Apps Android.

A partir dela, temos suporte a expressão lambda, métodos padrões de interfaces entre outras features que não existem na própria linguagem Java, como é o caso de extensão de função, funções de alta ordem entre outras que vemos formação desenvolvimento mobile.

Alex Felipe
Alex Felipe

Alex é instrutor e desenvolvedor e possui experiência em Java, Kotlin, Android. Atualmente cria conteúdo no canal https://www.youtube.com/@AlexFelipeDev.

Veja outros artigos sobre Mobile