Por enquanto, o Java é a linguagem nº1 do ranking da Tiobe e está sempre muito bem posicionada em outros rankings. Certamente quem anda contribuindo muito para isso é o Android. Claro! Não existe linguagem Android (apesar que existem linguagens do inferno…).
Andando por conferências mobile (cada vez maiores e mais importantes) percebo que a comunidade Android possui muitos desenvolvedores que nunca usaram o Java para outra coisa que não desenvolvimento Android. Ótimo! Quer dizer, ótimo com ressalvas…
Java fez 20 anos faz pouco tempo. V-i-n-t-e. Pode ser considerado uma peça de museu (e faz com que eu me sinta uma também). Nesse tempo, muito material de boas práticas apareceu e muitos erros foram cometidos e corrigidos. Então, seguem algumas recomendações de literatura e material para os Androideros se emaranharem mais profundamente neste cafezinho…
Em primeiro lugar, qualquer ser humano do mundo que trabalhe com orientação a objetos deveria ler o livro mais falado dessa comunidade: Java Efetivo. Por quê? Simplesmente porque o cara que escreveu o livro é responsável por uma quantidade considerável de todo o código que vai na JDK. É sério! Olhem o artigo na Wikipedia referente ao Joshua Bloch e vejam o currículo do camarada. Ele participou como candidato em uma votação para desenvolvedor mais influente da história.
Não basta ter currículo; tem que entregar valor. No Java Efetivo há diversas práticas para trabalhar com o Java. Patterns como builders, enum extensíveis etc. É leitura obrigatória.
Aliás, ele também é coautor de outros dois livros importantíssimos do Java. O primeiro é engraçadinho e mais focado nas “pegadinhas” da linguagem: Java Puzzlers. O segundo é um dos livros mais avançados de computação concorrente que existe (na minha opinião humilde): Java Concurrency in Practice. Tem que ter estômago para criar o pacote java.util.concurrent e todas as suas classes. Pergunte para um desenvolvedor Android avançado quais coleções são mais efetivas quando alteradas e acessadas concorrentemente, ou a diferença entre um Runnable e um Callable ou um Future. Inclua na lista qual a diferença entre as palavras reservadas synchronized e volatile. Melhores práticas para sincronizar o acesso a um bloco de código? Já aviso que este livro é BEM pesado e avançado. Apenas os destemidos de coração sobreviverão.
Outro livro essencial sobre “core” features do Java é o Java Generics & Collections. Aí o bicho pega bonito! Quem sabe, ao ler o livro, fique mais claro porque a pessoa que implementou generics no Java ficou meio bravo e criou o Scala só de birra.
Todo mundo conhece o famoso extends. Até aí tudo bem, mas e quando ele vira algo como <T extends MeuSuperTipo>? Ainda tranquilo… E esse <? extends OutroTipo>? Hmmm… Okay, até sei dizer do que se trata. Sabia que isso aqui compila <T super AutoClosable>? De onde surgiu esse super? E como eu pego os tipos por reflection? É possível?
Isso tudo é para deixar nossos Androideros mais familiarizados com o core do Java. No entanto, existe mais coisa no Java do que Java e Javac. Um ponto interessante é trabalharmos com outras ferramentas da JDK (ou JRE – isso será unificado logo, logo).
Talvez você já tenha visto em um projeto Android que você use no seu código algo assim na configuração:
apply plugin: 'android-apt' def AAVersion = 'XXX' dependencies { apt "org.androidannotations:androidannotations:$AAVersion" compile "org.androidannotations:androidannotations-api:$AAVersion" } apt { arguments { androidManifestFile variant.outputs[0].processResources.manifestFile }
Pera lá… O que é esse APT? Trata-se do Annotation Processing Tool. Não confundir com o apt-get do Linux! O APT é um sistema de plugin do Javac, ou seja, você consegue declarar no código alguns metadados (anotações) e criar um plugin do Javac que é notificado quando o compilador encontra estas anotações. É por isso que no exemplo acima temos duas dependências: uma com os metadados e outra com os processadores destes metadados. Os processadores não são incluídos no pacote final. Eles ficam apenas no classpath do Javac. O que eles fazem? Bem, o que você pedir para eles fazerem. Exemplos de uso no Android são: AndroidAnnotations, Dagger 2.0 etc. Faremos um artigo no futuro exemplificando o uso do APT.
Isso apenas mostra que o Java possui outras ferramentas. Existem coisas que fazem mais sentido no mundo Java corporativo, como o rmic (processador de classes que fazem chamadas remotas), gerador de classes por meio de WSDLs, API para Java AGENT (que possui um método pre-main) etc. Porém, existem coisas que o Android pode se beneficiar também como o APT. É importante saber qual o motor do carro que estamos usando.
Os caras que hoje estão cuidando do Android vieram quase todos do Javão. Por exemplo: Chet Haase e Romain Guy foram importantíssimos para o Java Swing. No livro Filthy RIch Clients eles tratam de todos os aspectos de animação em plataformas desktop. Desenvolvedores Android podem se beneficiar (e muito) dessa leitura.
Existem diversas comunidades que têm o Java como foco e sempre costumo ver as principais novidades delas: Java code geeks, projetos do Open JDK, Infoq etc.
Se vocês possuem outras dicas do mundo Java, deixem nos comentários!