O Bom e o Mau do Java 7 

Oct/11
17

Finalmente temos algo que podemos chamar de Java 7. Embora com muito atraso e relut√Ęncia da Oracle em liberar esta vers√£o para o p√ļblico (j√° que a libera√ß√£o √© dirigida a desenvolvedores ) aqui temos a vers√£o mais recente da tecnologia Java.

O Java 7 traz algumas altera√ß√Ķes na linguagem Java,¬† algumas altera√ß√Ķes na JVM e algumas API novas. Al√©m disso temos a primeira altera√ß√£o no bytecode desde sempre. Podemos dizer que o tema do Java 7 √© “Criar caminho para o Futuro” (leia-se Java 8 e 9). Como altera√ß√Ķes na Linguagem temos : Swicth com Strings ,melhor infer√™ncia de tipos com operador diamante e altera√ß√Ķes para invoca√ß√£o de var-args , melhores literais para n√ļmeros,¬† base bin√°ria e melhor suporte a tratamento de exce√ß√Ķes (multi-catch , re-throw e try-with-resources) e suporte a unicode 6.0.¬† Para as API temos a nova API de processamento paralelo Fork-Join¬† e a nova , muito aguardada , FileSystem API (parte do novo pacote de IO:¬† NIO.2) .Existem tamb√©m alguns melhoramentos na API java.util.Locale para¬† internacionaliza√ß√£o como a nova enum Locale.Category que permite distinguir objetos Locale para display e para formata√ß√£o. A NIO.2 traz tamb√©m suporte a mais protocolos de comunica√ß√£o como SCTP , SDP entre outros. A altera√ß√£o no bytecode √© a nova instru√ß√£o invoke dinamic que traz consigo a nova API de manipula√ß√£o de m√©todos. Al√©m disso muitas melhorias na renderiza√ß√£o. A lista completa de mudan√ßas na pagina de release da Oracle

N√£o vou exemplificar cada altera√ß√£o existem muitos sites sobre isso. Quero, em vez, me debru√ßar sobre¬† as causas e consequ√™ncias das altera√ß√Ķes.

Switch com Strings. Esta funcionalidade √© a mais perigosa de todas. N√£o vai ajudar a escrever programas melhores j√° que vivemos escrevendo programas sem ela ha 15 anos. Adicionar esta capacidade s√≥ vai ajudar a cria Programas Orientados as Strings (POS) ou pior, programas orientados a gambiarra (POG). Uma discuss√£o interessante sobre switch e sua historia aqui. Mas o objetivo desta funcionalidade n√£o √© melhorar o Java. Esta era uma requisi√ß√£o de melhoria desde o java 1 que n√£o viu a luz do dia devido ao problema associado √† fun√ß√£o de hash usada na classe String que foi modificada e melhorada ao longo do anos. √Č que, para isto funcionar, √© necess√°rio usar a fun√ß√£o de hash para transforma o switch de string em switch de int que √© o que realmente funciona eficientemente, mas para isso o resultado do hash tem que ficar hardcoded no .class. O Java 7 deu este passo estabelecendo que a implementa√ß√£o de hashCode do String n√£o ir√° mudar mais. Mas ser√° que n√£o ? Eu por mim vou continuar n√£o usando Strings para este tipo de coisa. Ali√°s uma regra bem v√°lida do Efective Java.

Melhorias na infer√™ncia de tipos. O operador diamante √© bem vindo j√° que nos livra de repetir um monte de assinaturas de tipo. Para quem j√° escreveu mapas de cole√ß√Ķes sabe do que estou falando. Al√©m disso usar tipos gen√©ricos em var-args n√£o causa mais um aviso do compilador.¬† Nada do outro mundo para o programador, mas o trabalho que o compilador faz para inferir os tipos e , no seu melhor, evitar erros, √© extraordin√°rio. Uma altera√ß√£o direcionada a nos fazer escrever menos respondendo √†s criticas que o java √© muito verborraico.

A possibilidade de escrever n√ļmeros em base bin√°ria √© relativamente interessante. √ötil se voc√™ mexe com protocolos/arquivos bin√°rios. A nova possibilidade de separa√ß√£o de algoritmos com underline ajuda bastante a formar os bytes ou as palavras. Uma mudan√ßa √† primeira vista est√©tica, mas que √© direcionada a usar java como uma linguagem de “baixo n√≠vel” para ler e escrever bin√°rio.

A grande altera√ß√£o da linguagem s√£o as novas funcionalidades relacionadas ao bloco try-catch. A primeira √© a possibilidade de capturar multiplas exce√ß√Ķes de um catch s√≥. Isto ajuda a escrever menos blocos de c√≥digo e ajuda a seguir o principio DRY (Don’t repeat yourself – N√£o se Repita). Contudo criaria um problema caso voc√™ pense em relan√ßar a exce√ß√£o.¬† A infer√™ncia de tipos entre em jogo aqui tamb√©m. Ao relan√ßar a exce√ß√£o o compilador sabe fazer o traking de quais exce√ß√Ķes s√£o possiveis dentro do try e portanto quais s√£o possiveis para relan√ßamento.

A outra mec√Ęnica que se aproveita do relan√ßamento √© o novo try-com-recursos que √© uma forma de trabalhar com recursos “fech√°veis”. A nova instru√ß√£o toma conta de chamar o .close no momento certo e tratar as exce√ß√Ķes que s√£o lan√ßadas no close.¬†¬† √Č um problema quando voc√™ acessa o banco, d√° erro no resultset voc√™ captura e fecha a conex√£o, mas ai d√° erro no fechar da conex√£o. A exce√ß√£o que voc√™ recebia era a que aconteceu no close e n√£o a que aconteceu no resultset. Isto era realmente um problema e se voc√™ quisesse controlar isto. Agora, o java 7 modificou essa regra – desde que use o try-com-recursos¬† – em que a exce√ß√£o lan√ßada √© a exce√ß√£o original, e a exca√ß√£o secund√°ria (chamada de exce√ß√£o suprimida) √© adicionada ao stackstrace de forma “paralela” usando os novos m√©todos na class Throwable addSupressed e getSupressed. O controle de exce√ß√£o ficou ainda mais robusto.

isto é importante porque é usado no URLClassloader. Este é o classloader mais utilizado que não tinha uma semantica de fechamento, e agora que tem, sem um mecanismo robusto como o try-com-recursos , continuaria dando memory-leaks. A sintaxe não é a mais intuitiva (estão planejadas melhorias para o java 8), mas é uma instrução de controle muito importante e que faltava no arcenal.

O tema do Java 8 ser√° “Multicore” e o do Java 9 “Cloud”.

Para multicore dar certo o fork-join √© um framework necess√°rio. Existiu muita polemica se seria util lan√ßar este framework sem lan√ßar closures (lambdas), mas acabou saindo. Lembrar que esta vers√£o do java √© mais para desenvolvedores do que usu√°rios e em particular para desenvolvedores que desenvolvem mecanismo em cimado java (como quem desenvolver as ‘vm’ de jruby, scala , etc…) . Com a libera√ß√£o “adiantada” estas equipes t√™m mais tempo para se preparar para o mundo com lambdas do java 8.

Para o cloud dar certo, al√©m do multicore, √© preciso abstrair o sistema de arquivos. Servidores de aplica√ß√£o poder√£o tirar partido disto. A nova API de Filesystem permite trabalhar n√£o apenas com discos da m√°quina, mas criar sistema virtuais de arquivos , por exemplo, acessar um zip como se fosse uma pasta. Isto √© uma tendencia e era aguardado ha muito tempo ( ali√°s eu j√° tinha abordado este assunto de arquivos virtuais no MiddleHeaven). Mas API que far√° ainda mais diferen√ßa – especialmente para criadores de ferramentas e servidores –¬† √© a API WatchService que permite registrar listeners para escutar quando arquivos s√£o modificados, inclu√≠dos ou exclu√≠dos. Hoje isto √© feito com threads e timers, mas com a nova API estaremos ligados diretamente ao sistema operacional que avisar√° a API quando algo mudar e a API nos avisar√° a n√≥s. Espero que as pr√≥ximas vers√Ķes de servidores de aplica√ß√£o se baseiem nestas features.

Resta falar sobre o invoke dynamic. Esta instru√ß√£o do bytecode permite que se invoque um m√©todo sem que se saiba qual a sua implementa√ß√£o. A implementa√ß√£o do m√©todo ser√° pesquisada em runtime. √Č um mecanismo bem complexo que permite criar links din√Ęmicos com m√©todos em runtime. Isto √© ideal para linguagens como groovy e ruby que permitem chamar m√©todos em classes como se eles lhes pertencessem mas na realidade n√£o est√£o definidos na classe (¬† e sim em alguma outra classe ). Esta instru√ß√£o √© orientada a simplificar a vida de quem tem que implementar as vm das linguagens din√Ęmicas e com isto tornar a JVM realmente poliglota.

A API Java foi incrementada para poder manipular m√©todos de forma program√°tica. Isto √© interessante porque √© agora poss√≠vel criar opera√ß√Ķes de currying e outras coisas interessantes da programa√ß√£o orientada a fun√ß√Ķes mesmo ainda sem lambdas.

√Ä parte da swicth de strings que navega contra a mar√© o resto das altera√ß√Ķes √© bastante poderosa. O ponto √© que toda esta capacidade √© em potencial e n√£o muito “pr√°tica” ainda. √Č mais ou menos como o generic do java 5, demorou um tempo at√© que as pessoas se habituassem e come√ßassem a fazer coisas interessantes com a ferramenta. O Java 8 promete uma mega altera√ß√£o da forma de programar em java, e o 9 uma mega altera√ß√£o na forma como entendemos JEE¬† , mas o Java 7 lan√ßa as bases e tra√ßa algumas dire√ß√Ķes dando ferramentas para aumentar a efic√°cia dos c√≥digos e o alargamento da base de linguagens que rodam na JVM.

Se começasse um projeto novo hoje, muito provavelmente usaria java 7, não pelo que ele traz de novo, mas como preparação para o java 8 que, se tudo correr bem, irá ver a luz do dia em 2013.

Um comentário para “O Bom e o Mau do Java 7”

  1. […] em cima da vm java. E o mais complexo ficou para a 8, na promessa que seria logo a seguir. A vers√£o 7 saiu em 2011 com a promessa da vers√£o 8 para 2012. Mas j√° foi dito que a 8 sair√° apenas em 2013, […]

Comente

Enquete

Sobre quais assuntos gosta de ler neste blog ?

View Results

Loading ... Loading ...

Artigos