O Java 8 é uma das atualizações de linguagem de programação mais esperadas em muitos anos. O lançamento contém a API de datas, API de stream e as lambdas. Inclui a remoção do permgen e termina com um bom conjunto de melhorias. Para aprender mais sobre este lançamento, sentamos com Georges Saab, vice-presidente de desenvolvimento de software da Java Platform Group na Oracle.
InfoQ: Para todos que não têm seguido o projeto lambda de perto, você poderia nos dar uma ideia do que foi envolvido nesta implementação? Acredito que esta é a primeira vez que tanto a linguagem, a VM e as bibliotecas evoluíram juntas de uma maneira coordenada.
A maioria das grandes funcionalidades em lançamentos anteriores foi feita de maneira que somente uma dessas três áreas foi afetada, ou alternativamente as mudanças em cada área foram introduzidas ao longo de uma série de grandes lançamentos.
Com o Lambda no Java 8, fizemos um conjunto coordenado de mudanças envolvendo a linguagem, as bibliotecas e a JVM, no qual ao longo do desenvolvimento, cada área foi capaz de influenciar e fortalecer o design e implementação das demais.
Por exemplo, experimentamos com diversas implementações alternativas do Lambda na VM e descobrimos que poderíamos utilizar o InvokeDynamic. Ao fazê-lo, encontramos pontos que poderiam ser melhorados no próprio InvokeDynamic. O desejo de se utilizar Lambdas de uma forma natural com as Collections nos levou ao design da Streams API, e então aos métodos de extensão, os quais exigiam suporte da linguagem.
Este tem sido um processo evolutivo ao longo de vários anos com bastante feedback da comunidade ao longo do caminho.
InfoQ: Você acredita que a adição de lambdas irá trazer de volta ao Java os desenvolvedores Groovy e Scala?
O interessante é que as duas linguagens mencionadas (bem como uma série de outras) executam na JVM. Realmente trabalhamos bastante para suportar outras linguagens além do Java na JVM, e acho que há muito para os implementadores de linguagens aprenderem com as experiências do que funciona bem e o que nem tanto. Claro que é muito mais fácil experimentar com uma linguagem com poucos milhares de desenvolvedores que com muitos milhões. Nosso enfoque tem realmente sido em abordar as coisas que vão melhorar a vida dos milhões de desenvolvedores Java por aí, evoluindo de uma forma consciente e responsável.
InfoQ: A combinação do Lambda e da Streams API nos ajuda a desenvolver código limpo e conciso, mas algumas preocupações têm sido manifestadas em relação a uma sobrecarga potencial sobre o desempenho, como filtro após filtro é aplicado para reduzir um conjunto de uma forma funcional. Isto é uma preocupação razoável? Quais otimizações foram introduzidas para mitigar essa sobrecarga?
As Streams permitem operações intermediárias e terminais. As operações intermediárias, tais como filtrar, não executam de fato nenhuma filtragem por si, ao invés disso criam um novo Stream, que quando percorrido, fornece os elementos que correspondem a um dado predicado. Assim, por um lado, a criação de filtros adicionais poderia resultar em um trabalho adicional a ser realizado em tempo de execução.
Por outro lado, o processamento de streams sob demanda, como todas as operações intermediárias de streams, permite ganhos de eficiência importantes, como várias operações podem ser realizadas em uma única passagem sobre os dados. Em parceria com otimizações importantes da JVM nos bastidores que o design de lambdas habilita, o impacto de filtros adicionais pode ser significantemente reduzido.
Outro ponto a ser considerado é que a utilização do paralelismo com Streams e Lambdas foi simplificado. Dessa forma, as operações de stream em paralelo podem se beneficiar da diminuição das restrições de ordenação nas quais os usuários em particular não conhecem os conflitos de ordenação do stream subjacente.
InfoQ: Outra funcionalidade importante do Java 8 são as Annotations nos Java Types para permitir que verificadores de tipo plugáveis sejam desenvolvidos. Poderia nos falar um pouco mais sobre isso, como por exemplo, o que se espera ver os desenvolvedores fazerem com isso?
Essa funcionalidade permite o uso de anotações nos nomes dos tipos na maioria dos lugares onde estes tipos podem ser usados. Como resultado dessa mudança, os desenvolvedores podem agora escrever anotações para detectar condições de erros em tempo de compilação usando verificadores de tipos plugáveis. Tais verificadores e esquemas de anotações estão sendo desenvolvidos na comunidade para questões de erros de null pointer, locking e internationalização.
Uma grande fonte de informação e implementação é o Checker Framework do Prof. Michael Ernst do checker-framework.org, que inclui um checker para não nulos, dentre mais de uma dúzia dessas ferramentas. Michael também atuou como líder da co-spec na JSR 308, no qual esta funcionalidade da linguagem foi especificada.
Seria bom ver os resultados de pelo menos um desses esquemas de anotações sendo aplicado sobre a base de código da JDK no futuro, e claro, ver a comunidade mais ampla de desenvolvedores Java começar a utilizar esta tecnologia em suas próprias bases de código e desenvolver novos verificadores para outras questões de qualidade de software.
Especialmente no que diz respeito a sistemas embarcados e aqueles no qual o aspecto segurança seja crítico, este tipo de inovação pode permitir que propriedades cruciais e restrições de tipos e seu uso ser qualificado e analisado estatisticamente, como parte do processo de compilação, fornecendo um caminho para usuários de outras linguagens de programação de domínio relevantes migrar para a plataforma Java no futuro.
InfoQ: Quais são as maiores melhorias, em sua opinião, para as linguagens dinâmicas no Java 8?
Em geral as melhorias de performance na HotSpot VM, e em particular o invokedynamic. Uma funcionalidade significativa nova no JDK 8 é o Nashorn JavaScript Engine, uma implementação leve de alta performance de uma linguagem dinâmica popular. Melhorar o desempenho do Nashorn nos ajudou a encontrar novas oportunidades de otimização na VM para implementações de linguagem dinâmica.
Adicionalmente, o Nashorn agora fornece uma maneira muito conveniente para usar o Java a partir do JavaScript oferecendo acesso fácil a classes Java, permitindo que aplicações JavaFX inteiras possam ser escritas em JavaScript, executando na JVM. Esse tipo de interoperabilidade transparente entre linguagens dinâmicas executando na JVM e o Java oferece uma maneira poderosa de se escrever tais aplicações.
InfoQ: Preocupações relacionando o Java e segurança raramente têm estado fora das manchetes do ano passado. O Java 8 contém alguma melhoria específica, seja para o para o plug-in Java no navegador ou para quaisquer outros pontos?
Uma série de melhorarias importantes de segurança e novas funcionalidades foram entregues como parte das atualizações do Oracle Java SE 7, incluindo Deployment Rule Sets(funcionalidade para empresas que gerenciam o seu ambiente de desktop Java diretamente) e Exception Site Lists(Lista de sites de exceção). Manter o valor da segurança do Java é uma prioridade para nós.
Além disso, o Java SE 8 contém várias funcionalidades novas de segurança. Os mais perceptíveis devem ser as melhorias na implementação do Transport Layer Security: TLS 1.2 é agora o padrão da plataforma. Em termos globais de APIs de segurança, existe uma série de outras melhorias, desde melhorias na verificação de revogação de certificados até novos algoritmos de criptografia.
InfoQ: Você sabe qual o percentual de desenvolvedores Java usando Java 5, 6 e 7? Existe algum plano para acelerar a adoção do Java 8?
Ao longo dos últimos seis a nove meses, tenho falado em conferências ao redor do mundo e toda vez pergunto qual versão estão usando. Apoiado sobre essa pesquisa informal e não científica, diria que a maior parte dos desenvolvedores Java estão usando o Java SE 7 hoje em dia, com uma (mas não insignificante) clara minoria ainda em 6, e um número pequeno em versões mais antigas. Do ponto de vista do desenvolvedor, o Java SE 8 vem com muitas razões convincentes para a rápida adoção sob a forma de novos recursos da linguagem e das APIs. Com IDEs como NetBeans, Eclipse e IntelliJ IDEA trabalhando duro para oferecer ferramentas excelentes para esses recursos em seus próximos lançamentos, eu esperaria ver os desenvolvedores adotá-lo rapidamente.
InfoQ: Um dos grandes temas do JavaOne no último ano foi em torno da unificação do Java ME, SE e EE. Até que ponto o Java 8 caminhou nessa direção?
Uma das muitas novas funcionalidades no Java SE 8 é o suporte a Compact Profiles. Eles definem alguns subconjuntos de perfis da plataforma Java SE, permitindo que aplicações que não requerem toda a plataforma serem publicadas e executadas em dispositivos menores. Juntamente com outras melhorias no HotSpot, como a redução do tamanho de metadados da classe, e o tamanho da VM em geral, este recurso permite que o JDK 8 possa ser escalado para o desenvolvimento de aplicativos e implantação em pequenos dispositivos. Para tornar isso mais fácil, uma nova ferramenta chamada jdeps está incluída no JDK 8 que permite aos desenvolvedores descubrirem de qual Profile seu código depende.
Vindo de outra direção, o Java ME 8 está sendo aprimorado para incluir uma linguagem mais próxima ao Java SE 8 com VM e alinhamento de bibliotecas. Enquanto ainda não é possível utilizar as lambdas em código Java ME 8, a plataforma agora suporta construções de linguagem Java introduzidas no Java SE 1.5, 6 e 7, como assertions, generics, enumerations, strings em switches, declarações try-with-resources e o operador diamond. Da mesma forma, as classes das bibliotecas do núcleo foram atualizadas com suporte para protocolos web modernos como IPv6 e funcionalidades avançadas de segurança, incluindo o suporte para TLS 1.2, trazendo as plataformas Java SE e Java ME muito mais próximas que no passado.
InfoQ: Quando veremos Stripped Implementations adicionadas ao Java?
Assim que o Java SE 8 for lançado, precisaremos voltar a examinar como esta funcionalidade pode ser adicionada à plataforma em um lançamento anterior ao Java SE 9. Não se trata de um problema técnico, mas de uma questão de garantir que o texto de especificação e o seu quadro jurídico permitirão casos de uso relevantes, evitando a fragmentação da plataforma Java.
Muito obrigado ao Georges por responder nossas questões. A Oracle apresentou formalmente o Java através de um Webinar.