Java é, e vai continuar sendo, a linguagem do momento. Há quem diga que a linguagem assume a forma de titã no mercado de desenvolvimento de software, principalmente considerando-se a quantidade de adeptos e novos adeptos há cada dia. Todo esse poderio, conquistado ao longo de algumas décadas de vida, fez com que a linguagem quebrasse paradigmas ano após ano, evoluindo ao ponto de construir ferramentas poderosas, de estarem presentes nos mais diversos tipos de aparelhos e se comunicando com as mais diversas tecnologias. E pensar que tudo isso começou bem antes... No C.

Java não é só mais uma linguagem de programação, mas considerada a principal plataforma de desenvolvimento no mundo, prova disso são os diversos pontos discutidos e contrariados por todo mundo acerca da linguagem:

  • Existem cerca de 9 milhões de desenvolvedores Java no mundo inteiro.
  • Java é a escolha nº 1 para os desenvolvedores.
  • É a plataforma de desenvolvimento #1.
  • 3 bilhões de telefones celulares executam Java.
  • 100 por cento dos discos Blu-ray leem com Java.
  • 97 por cento dos desktops corporativos executam Java.
  • 5 bilhões de Java Cards (Cartões Java) estão em uso.
  • 7 bilhões de Java Cards (Cartões Java) foram vendidos.
  • 89 por cento dos desktops executam Java.
  • 125 milhões de aparelhos de TV rodam.

O ano de 2013 para o Java, em contrapartida, foi muito importante e essencial para as novas features que a linguagem lançou principalmente em se tratando das novas versões do Java Se e Java EE, e que tanto a comunidade de desenvolvedores aguardava. Dois eventos, dentre eles o mais importante de todos, selaram estas mudanças: A edição do JavaOne 2013 e o Devoxx 2013. Ambos são eventos de grande porte, que reúnem a comunidade internacional de usuários, companhias e organizações interessadas no futuro do Java como uma das tecnologias open source mais importantes da atualidade.

JavaOne 2013

O JavaOne 2013 reprisou a sua versão de 2012, focando sempre na frase que marcou os dois eventos: "fazer o futuro Java".

"Há muita coisa acontecendo na indústria, com deslocamentos maciços e inovação acontecendo que representam enormes desafios e oportunidades para o Java.". Com essa frase o vice-presidente e Gerente de Produtos Java na Oracle, Peter Utzschneider marcou tudo que o evento foi e representou. Além disso, ele observou que a Oracle compartilha de um objetivo em comum com a comunidade Java que é fazer o Java ficar melhor, mais forte, mais robusto, e relevante para as próximas décadas.

O evento contou com cinco dias de oitos faixas de apresentações. Foram mais de 500 sessões, 490+ palestrantes, mais de 70 expositores, festas até tarde da noite, desafios de programação, tudo na incrível cidade de São Francisco, EUA.

O evento foi dividido em oito pistas, com uma novidade esse ano: a pista sobre Segurança Java foi adicionada este ano. Em suma, tivemos basicamente os seguintes tópicos sendo discutidos:

  • Desenvolvimento cliente e integrado com JavaFX.
  • Núcleo da Plataforma Java.
  • Edge Computing com Java em aplicações embutidas, Smart Card e Aplicações da Internet das coisas.
  • Línguas Emergentes na Java Virtual Machine.
  • Protegendo o Java.
  • Ferramentas e Técnicas de desenvolvimento Java.
  • Java EE Web Profile e Plataforma de Technologias.
  • Java Web Services e Cloud.

A Internet das Coisas

Segundo a Wikipédia, a Internet das Coisas (ou Internet of Things, IoT), pode ser definida da seguinte forma:

“[...] O objetivo foi, desde o início, criar um sistema global de registro de bens usando a single numbering system chamado Electronic Product Code. A Internet das coisas é uma revolução tecnológica que representa o futuro da computação e da comunicação e cujo desenvolvimento depende da inovação técnica dinâmica em campos tão importantes como os sensores wireless e a nanotecnologia.”

Esse é um termo que está ganhando cada vez mais espaço no mercado de tecnologia. Pois está diretamente relacionado ao futuro das coisas e da forma como as pessoas lidarão com a tecnologia de maneira geral. O princípio básico é ligar todas as coisas e aparelhos que você usa no seu cotidiano a grandes bases de dados através de redes sem fio que terão o potencial e inteligência para identificar os sinais e devolver as respostas corretas.

Paralelo a isso, temos também a crescente disputa entre as gigantes da tecnologia sobre quem irá desenvolver a tecnologia ideal para isso, e o Java é uma grande candidata. Durante o JavaOne, um dos pontos que mais marcaram foi exatamente esse: como fazer do Java a tecnologia perfeita para estar presente em todo lugar?

Se pensarmos bem, talvez nenhuma outra tecnologia tenha se adaptado tão bem ao conceito multiplataforma como o Java.

Nandini Ramani, vice-presidente de Engenharia, Plataformas Java Cliente e Embarcadas, fez um forte argumento de que a Internet das coisas está seriamente necessitando de uma plataforma padronizada para unificá-la e é óbvio que o Java está mais bem equipado para servir a esse propósito. Além disso, ele descreveu o esforço para unificar a plataforma Java, especificamente, Java ME com Java SE e apontou para três coisas que conduzem esta unificação. "Em primeiro lugar", explicou ele, "a Lei de Moore é a fabricação de dispositivos mais capazes. Segundo, Java SE está sendo reduzido para caber em espaços embarcados e em dispositivos menores. E terceiro Java ME está sendo trazido para um grau de paridade com o Java SE.".

HTML 5

O lançamento da versão 5 da linguagem HTML até então não constitui tanta novidade para a maioria dos leitores deste artigo. Entretanto, com o lançamento da nova versão do Java EE, o foco da tecnologia para com o HTML5 nunca esteve tão maior e integrado.

Na sua quinta versão, o novo HTML, ainda não acabado, traz importantes mudanças em relação ao que a linguagem pode fazer no mundo web de uma forma geral, até então bem restrita em meio a tantos protocolos, regras e confusões entre o verdadeiro papel da linguagem face ao CSS. Os quesitos semântica, acessibilidade, suporte a multimídias, e legibilidade tanto por parte dos usuários desenvolvedores quanto pelos próprios softwares browsers, fazem com que a linguagem evolua para ser a nova HTML, XHTML e HTML DOM.

A nova versão do JEE está totalmente focada em fornecer recursos de produtividade para o desenvolvimento de aplicações Java EE usando HTML5. "Java EE 7 traz toda esta estrutura empresarial amplamente utilizada para a idade moderna do HTML5 e também traz melhorias significativas na produtividade do desenvolvedor, que terá resultados excepcionais na qualidade do código", disse o analista Al Hilwa, da IDC.

Além disso, é possível também comunicar a tecnologia com outros frameworks Java Web, como JSF por exemplo. O framework em suas versões mais recentes também está se atualizando para fornecer recursos mais integrados e fáceis de implementar junto à HTML5. “As capabilities do JavaServer Faces 2.2 no Java EE 7 adicionam ‘um suporte de marcação à HTML5 amigável’", diz Linda DeMichiel, líder da especificação Java EE.

Prêmio Java Community Awards

A cerimônia de premiação do Java Community Process (JCP) celevrou importantes contribuições para a comunidade Java, no topo do Hotel Hilton. Os vencedores deste ano foram:

  • JCP Membro/Participante do Ano: Azul Systems, Gil Tene
  • Outstanding Spec Lead: Brian Goetz, Oracle, pelas Lambda Expressions
  • JSR mais significativa: JSR 335, expressões lambda para a Linguagem de Programação Java
  • Participante do Programa Adote uma JSR: Marrocos JUG e EGJUG, Mohamed Taman, Faissal Boutaounte

Duke's Choice Award 2013

A cerimônia de premiação do Duke's Choice Award 2013 (Figura 1) comemorou a inovação com Java. Os vencedores, listados abaixo, empurraram as fronteiras da medicina e da tecnologia através da simulação do cérebro humano e do sistema músculo-esquelético, fornecendo orientação aos carros, satélites no espaço e peixes robótico, oferecendo uma melhor formação para os futuros programadores Java, tornando as aplicações Java mais seguras e contribuindo para a construção de comunidades.

  • Contrast, Contrast Security
  • Devoxx4Kids, DEVOXX
  • The Dutch Java User Group, NLJUG
  • ISIM, ISBAK
  • Bintray, JFrog
  • jCardSim, Licel
  • GEONS Ground Support System, National Aeronautics and Space Administration
  • OpenSim, O National Institutes of Health Center for Biomedical Computation e o National Center for Simulation in Rehabilitation Research
  • openHAB
  • Jessikommand, Robotswim
  • Neuroph, University of Belgrade's Faculty of Organizational Sciences

Figura 1. Duke's Choice Award 2013

Java SE

O ano de 2013, assim como todos os grandes eventos onde se ouviu falar de Java SE, se resumiu a Lambdas.

Lambdas são uma característica muito popular de muitas linguagens de programação modernas. Eles apóiam um estilo mais funcional de programação e suporte usando um padrão de "map-filter-reduce" na recolha de dados.

Antes da adição de lambdas à linguagem Java, recursos de características semelhantes já estavam disponíveis, mas foram implementados usando classes internas anônimas. Aquelas classes difíceis de ler e nas quais você tinha que escrever um monte de código clichê. Além disso, lambdas também foram adicionados à linguagem Java, pois elas tornam mais fácil a implementação do processamento multi-threaded de coleções, apoiado pelo novo fluxo API.

Para que o leitor tenha uma visão mais aprofundada da nova feature e para aqueles que não conhecem como o recurso funciona, vejamos alguns exemplos na Listagem 1.

Listagem 1. Código exemplo de uso da Lambda


  1. x -> x % 2 == 0;
  2. (char a) -> a == 'b';
  3. (x, y) -> x + y;
  4. (int a, int b) -> a * a + b * b;
  5. () -> “ABC”
  6. () -> { return 41.3 };
  7. (String s) -> { System.out.println(s); };
  8. () -> { System.out.println("Olá mundo!"); };

Vejamos abaixo as explanações para cada uso, em ordem de execução:

  1. Dado um número x retorna um booleano que indica se é ímpar.
  2. Dado um caracter a retorna um booleano que indica se é igual a 'b'.
  3. Dados dois números x e y retorna outro número com a sua soma.
  4. Dados dois números inteiros a e b retorna outro inteiro com a soma de seus quadrados.
  5. Dado nenhum parâmetro retorna a String "ABC".
  6. Dado nenhum parâmetro retorna o double 41.3.
  7. Dada uma string s imprime a string para a saída principal e retorna void.
  8. Dado nenhum parâmetro imprime Olá mundo! à saída principal e retorna vazio.

Além disso, alguns outros conceitos se aplicam ao uso de Lambdas:

  • Uma expressão lambda pode receber zero, um ou mais parâmetros.
  • O tipo dos parâmetros pode ser declarado explicitamente ou pode ser inferido a partir do contexto.
  • Os parâmetros são colocados entre parênteses e separados por vírgulas.
  • Parênteses vazios são usados para representar um conjunto vazio de parâmetros.
  • Quando há um único parâmetro, se o seu tipo é inferido, não é obrigatório o uso de parênteses.
  • O corpo da expressão lambda pode conter zero, uma ou mais declarações.
  • Quando há uma única instrução chaves não são obrigatórias e o tipo de retorno da função anônima é o mesmo que o da expressão corporal.
  • Quando há mais de uma instrução, então estas devem ser colocadas entre colchetes (um bloco de código) e o tipo de retorno da função anônima é o mesmo que o tipo do valor retornado dentro do bloco de código, ou nulo, se nada for retornado.

A API de Stream fez alterações na já existente API de coleções. Para dar suporte à compatibilidade com versões anteriores e não quebrar o código existente que antes usava coleções, algumas interfaces Java foram alteradas para incluir o conceito de implementações do método padrão. Este conceito permite um comportamento de herança múltipla, de fato, em Java, mas regras específicas são aplicadas para evitar o problema do "diamante da morte". Além disso, determinadas interfaces podem ser anotadas como interfaces funcionais. As interfaces funcionais são interfaces com um único método, e suportam expressões lambda.

Além do Lambda, o Java SE 8 também inclui algumas outras alterações. Uma nova API de data/hora está embutida no SDK, com base na API popular JodaTime. Novos métodos, baseados nas Commons Colections foram adicionados à API Java Collection. O espaço PermGen da JVM foi substituído por MetaSpace onde a informação será armazenada na memória nativa. Por último, mas não menos importante, um novo motor de JavaScript chamado Nashorn será implementado e integrado ao SDK.

Olhando um pouco mais para o futuro, e analisando a apresentação de Mark Reinhold "Uma Plataforma Java Modular e o Projeto Jigsaw" no Devoxx 2013 é possível ver que os objetivos do projeto Jigsaw, que foi adiado do Java SE 8 para Java o SE 9, podem trazer ainda mais benefícios para o Java SE e para a plataforma de uma forma geral, tais como modularização do Java SDK para melhorar a escalabilidade, desempenho e segurança. Mark propôs uma solução usando arquivos *.jmods, descrevendo quais módulos do SDK você vai incluir e, efetivamente, criar o seu próprio JRE personalizado. Ele deu uma visão geral de quais módulos provavelmente existem e como eles poderiam ser colocados juntos em um aplicativo de trabalho. Esta pode ser uma solução se o seu espaço é limitado. Mark fez uma boa apresentação, e o projeto pode resolver alguns problemas ainda existentes no SDK atual.

Linguagens JVM

As linguagens JVM compreendem uma relação de linguagens de programação que são usadas para produção de software que são executados na Java Virtual Machine (JVM). Algumas dessas linguagens são interpretadas por um programa Java, e algumas são compiladas para bytecode Java e compiladas em JIT durante a execução de programas regulares de Java para melhorar o desempenho. A JVM foi inicialmente projetada para suportar apenas a linguagem de programação Java. No entanto, como o passar do tempo, cada vez mais linguagens foram adaptadas ou projetadas para ser executada na plataforma Java. Dentre a lista de mais de 50 opções, destacam-se Clojure, Groovy, Scala, JRuby, Rhino, dentre outras.

Muita gente questiona o porquê de tantas linguagens usando a JVM. Discussões a parte, uma frase marca o velho dicurso de que tudo gira em torno da JVM.

"A maioria das pessoas falam sobre a linguagem Java, e isto pode parecer estranho vindo de mim, mas eu não poderia me importar menos. O centro do ecossistema Java é a JVM."

O resultado disso é a gama crescente de desenvolvedores Java que cada vez mais precisam se especializar em diferentes linguagens, se habituar a diferentes sintaxes, ferramentas de desenvolvimento, padrões de projeto e técnicas de programação, uma vez que tudo está integrado.

Veja, por exemplo, na Figura 2 a evolução das linguagens e seu histórico ao longo dos anos.

Figura 2. Evolução das linguagens JVM

A grande verdade é que o ano de 2013 ficou marcado pelo crescimento das linguagens JVM. Escolha uma também.

JEE

A nova versão do Java Enterprise Edition (JEE), em sua edição de número 7, percorreu o mundo com grande empolgação e alvoroço. Após todo o histórico da versão da plataforma, desde a época em que os arquivos de configuração XML's reinavam na tecnologia até os tempos modernos com a adoção do CDI e das annotations, muita coisa já evoluiu e continua a evoluir. Mas antes de adentrar neste universo de novidades, vejamos o gráfico representado na Figura 3, que demonstra brevemente o histórico do Java EE.

Figura 3. Quadro de evolução do JEE

O Java EE 7 focou totalmente nas nuvens, HTML5 e WebSockets como novas tecnologias, suporte à geração e análise de JSON, JMS simplificados e JAX-RS API, melhor integração do CDI, novas especificações para aplicações batch e Concorrência e algumas pequenas alterações de produtividade do desenvolvedor em vários outras especificações. Essas funcionalidades podem ser mais bem analisadas através da Figura 4.

Figura 4. Novos recursos JEE7

CDI 1.1

O CDI agora está integrado à maioria das especificações do Java EE como JPA, EJB, Bean Validation, EventListeners, etc. No passado, algumas especificações como EJB 3.x tinham seu próprio mecanismo de injeção de dependência. No EJB 3.x você usaria o @EJB anotação para injetar EJBs. Agora você também pode usar o CDI para isso.

O CDI é ativado por padrão. O arquivo beans.xml não é mais necessário, a menos que você deseje substituir a nova opção bean-discovery-mode ou outra convenção sobre configuração. A opção bean-discovery-mode descreve quais beans serão descobertos e injetados automaticamente. Você pode especificar os seguintes valores:

  • all: Todos os tipos de arquivo serão considerados para descoberta e injeção.
  • annotated: Somente os tipos de bean com anotações definidas no arquivo serão consideradas.
  • none: Nenhum bean no arquivo será considerado.

Você pode usar uma nova anotação: @Vetoed. Beans anotados com @Vetoed não serão descobertos nem injetados, independentemente do bean-discovery-mode de configuração.

EJB 3.2

O EJB 3.2 contém inúmeras atualizações e melhorias. Agora métodos de retorno de chamada do ciclo de vida pode opcionalmente ser transacionais onde antes o gerenciamento de transações foi ignorado na maior parte em retornos de chamada do ciclo de vida.

Você pode desativar a passivação do bean stateful utilizando a anotação @Stateful(passivationCapable = false). Em alguns casos, isso pode aumentar o desempenho, escalabilidade e robustez.

EJB 3.x Lite é uma versão leve da versão total da API EJB 3.x. Ele suporta desenvolvimento EJB, mas não contém comunicação remota do MDB ou endpoints JAX-WS/serviços JAX-RPC. EJB 3.1 Lite não contém beans de sessão assíncronos nem serviços de timer. Agora em EJB 3.2 Lite, chamadas assíncronas locais e um EJB Timer Service não persistente estão incluídos. Você pode definir um método assíncrono, anotando com @Asynchronous. Métodos de serviço de timer podem ser programados usando a anotação @Scheduled. Você pode usar algum tipo de expressão cron para definir a programação.

Este artigo apresentou essa breve retrospectiva sobre a tecnologia Java no ano de 2013. Muito poderia ser acrescentado aqui ainda, tais como referências às tecnologias:

  • Bean Validations 1.1
  • Interceptors 1.2
  • Concurrency Utilities 1.0
  • JPA 2.1
  • JTA 1.2
  • JMS 2.0
  • Servlet 3.1
  • WebSocket 1.0
  • EL 3.0
  • JSF 2.2
  • JAX-RS 2.0
  • JSON-P 1.0
  • Batch Applications 1.0
  • JavaMail 1.5
  • JCA 1.7
  • Cloud Computing

Mas falar sobre todas essas tecnologias deixaria o artigo longo demais. Em suma, isso é basicamente um resumo do que de mais importante aconteceu no ano e servirá para você basear quais rumos deverá tomar no próximo ano de 2014 em relação ao mundo Java.

Claro, o mundo Java não termina no Java EE 7. Eles já estão ansiosos para lançar o Java EE 8. No Java EE 8, o foco será alavancar a plataforma nas nuvens, padronizando PaaS para fazer aplicações portáteis na nuvem em diferentes provedores de nuvem. As ligações de especificação também vão continuar a melhorar a plataforma e atualizá-la para HTML5, caching, NoSQL, programação poliglota e outros trending topics.

Até lá, se atualize e viva o Java.