Local classes em Java

março 5th, 2008

Acho que um dos recursos mais desconhecidos da linguagem é a existência das local classes. Local classes são classes definidas dentro de métodos ou blocos em geral, algo como:

public void umMetodo() throws InterruptedException {
    class LocalRunnable implements Runnable {
       private UmBean umBean;

       public void run() {
           umBean = variavelPrivada.fazAlgoLento();
       }

       public UmBean getUmBean() {
          return umBean;
       }
    }

    LocalRunnable lr = new LocalRunnable();
    Thread t = new Thread(lr);
    t.start();

    try {
       t.join();
    } catch (InterruptedException ie) {
       throw ie;
    }

    return lr.getUmBean();
}

No exemplo acima, criamos uma implementação de Runnable que permite obter, após a execução do método run(), o valor computado de uma operação lenta (ok, fora permitir que a thread atual possa ser interrompida enquanto o método executa, não há lá grandes vantagens em criar uma thread para esperar imediatamente pelo seu resultado).

Muitas vezes cria-se uma inner class “nomeada” apenas para ter acesso a alguns métodos adicionais, visto que não é possível chamar normalmente um método de uma anonymous inner class. As local classes resolvem justamente esse problema, como o exemplo acima demonstra.

E você, conhecia esse recurso? Mais informações na JLS.

O infame bug de self-assignment / atribuição a si mesmo

março 4th, 2008

Acabo de ajudar o pessoal do cliente a resolver um erro que é comum em linguagens de programação e que me levou a refletir um pouco.

No caso, havia uma trigger PL/SQL (Oracle 9.x.y.z) em que havia uma variável qualquer, que chamaremos aqui de exemplo. Havia também uma tabela qualquer com uma coluna EXEMPLO – levando em conta que os nomes não são case-sensitive; apenas reflito como estavam sendo usados no código. Era feito um select semelhante a:

SELECT
 INTO 
FROM TABELA T
WHERE T.EXEMPLO = exemplo

E ninguém conseguia entender qual era o bendito erro. Bem, para o Oracle, o where acima é a mesma coisa que:

WHERE T.EXEMPLO = T.exemplo

também conhecido por, hmmm, true. Logo, o where não fazia nem de longe o que o desenvolvedor esperava. Foram perdidas umas 3 horas até que me contaram o problema e eu o detectei imediatamente no código – obviamente, porque também já apanhei disso antes.

A mesma coisa acontece em Java quando uma variável local tem o mesmo nome de uma variável de instância e se esquece de usar o this na atribuição. Qualquer pessoa com um pouco de experiência na linguagem já viu esse erro na vida.

Embora em Java as IDEs detectem esse tipo de erro, eu até hoje não entendo por que essas operações de self-assignment não são reportadas como erro de compilação. Alguém aí tem alguma boa razão para o compilador aceitar isso?

genesis 3.1-RC1

março 3rd, 2008

No final da semana passada, lançamos o genesis 3.1-RC1. Essa versão possui uma série de correções em relação a 3.0, além de algumas novas funcionalidades.

O genesis é um framework que facilita o desenvolvimento desktop (Swing, SWT e Thinlet) usando um modelo de programação baseado em JavaBeans e anotações que permite ao desenvolvedor focar na lógica de apresentação ao invés de lidar com a API gráfica.

A adoção no Brasil tem sido significativa: o volume de tráfego na lista de usuários em português mostra o aumento da popularidade do framework, e ainda há perguntas postadas em fóruns/comunidades como o SouJava e o GUJ. Esperamos esse ano divulgar mais o projeto e continuar trabalhando para que ele melhore ainda.

Mais informações sobre as novidades podem ser encontradas nas release notes.

Tirando a poeira

janeiro 30th, 2008

Meu Deus, seis meses sem blogar? Pois é, sempre acontecem essas coisas.

Bem, tomei vergonha na cara e subi as palestras do JavaOne e do JustJava do ano passado. Tenho trabalhado bastante no genesis – a release 3.1 está se aproximando -, na JSR-310 – um Early Draft deve sair em breve – e experimentado muito com Scala, linguagem da qual pretendo falar bastante aqui no blog em breve.

Bem, espero que volte a postar mais aqui em breve. Ou então, até 2009 ;-)

Palestras no JustJava 2007

julho 16th, 2007

Vou apresentar 3 palestras no JustJava 2007:

  • 02/08, 11:30 – “Closures: Modernizando a linguagem Java”, com o Rodrigo Kumpera, vulgo louds
  • 03/08, 18:00 – “Genesis 3.0: Swing, SWT e Thinlet mais simples do que nunca”, com o Michel Graciano
  • 04/08, 13:30 – “JSR-310: Uma nova forma de lidar com datas e horas”, com o Fábio Kung

A primeira faixa de preço promocional se encerra nesta sexta, 20/07, então não perca tempo e se inscreva!

Palestra do JustJava de 2005

julho 13th, 2007

O Claudio Miranda acaba de colocar no ar um vídeo sobre a palestra que fiz com o Allan em 2005 sobre o genesis.

Embora várias coisas tenham mudado (os planos para o 3.0, o suporte Swing/SWT e afins), no geral ainda vale a pena:



Configurando o projeto vazio do genesis no NetBeans

julho 11th, 2007

Uma das principais dúvidas que as pessoas têm ao começar a usar o genesis é como configurar o projeto vazio no NetBeans. Por isso mesmo, fiz o seguinte demo no Wink que demonstra como fazer isso:



Comentários são bem-vindos!

genesis 3.0

junho 11th, 2007

Após 2 anos e meio de desenvolvimento, o genesis 3.0 acaba de ser lançado.

Por que você deveria usar o genesis no seu projeto desktop?

Saiba mais informações no site do projeto.

Resumo JavaOne 2007

maio 17th, 2007

Bem, durante esse JavaOne tentei fazer uma cobertura simultânea do evento em dois idiomas; descobri que nem em um dá pra fazer. Isso não quer dizer que não possa postar um resumão aqui :-)

Na segunda (07/05) ocorreu o NetBeans Day. Muitas coisas legais foram mostradas no evento, como o suporte a Ruby/JRuby, que é impressionante e as novidades do editor (que correspondem a uns 95% das reclamações do povo que usa Eclipse). Aproveitei a sessão sobre as novidades do Matisse para o NetBeans 6 para expor uma questão que já tem uns 2 anos e que eu detalhei em inglês no java.net. Basicamente, faz dois anos que peço que o Matisse seja extensível e permita implementações genéricas de binding, mas depois de tanto tempo os caras vão se amarrar com a solução da JSR-295, que é extremamente limitada. Aguardem mais explicações sobre o assunto no meu blog em inglês.

No final do dia, durante a apresentação do James Gosling, o Bruno Souza foi convidado a subir o palco para falar do NetBeans Dream Team, que também foi convidado a subir ao palco. Essa equipe inclui dois brasileiros: o Vinícius Senger, da Globalcode, e o Edgar Silva, do JBoss. É o Brasil mostrando sua relevância na comunidade Java mundial.

No dia seguinte, na sessão inicial do JavaOne, o John Gage disse a sua já célebre frase: durante o JavaOne, todos devem ser brasileiros. Durante o keynote, Richard Green anunciou que o JDK finalmente é open-source e está disponível através do projeto OpenJDK. Para garantir que o projeto seja tocado de forma justa e com a devida participação da comunidade, foi eleito um corpo governante do projeto, que inclui a Fabiane Nardon, nossa conterrânea e ganhadora do Duke Awards.

O foco do Java no cliente foi enfatizado através de diversos anúncios. Primeiro, que as novas vers&oatilde;es do Java SE começando com o 6 update 2 terão diversas melhorias de performance e um download inicial reduzido, que se comenta que estará entre 2 e 4 Mb. A tecnologia oficial de combate ao Flash foi lançada: JavaFX, um conjunto de tecnologias voltada ao desenvolvimento de clientes ricos. Possui uma linguagem de script própria, JavaFX Script, que será suportada no NetBeans. Há também o JavaFX Mobile, que permite rodar aplicações Java SE, Java ME e também trabalhar com Java FX em dispositivos móveis, como celulares.

Na sequência, assisti a palestra do Danny Coward sobre o futuro do Java SE e ele citou a JSR-310 como parte das JSRs que vão integrar o Java SE 7. Foi o primeiro pronunciamento oficial da Sun sobre o assunto e eu e o Stephen, que também estava assistindo a palestra, ficamos muito felizes de ver nosso trabalho reconhecido.

Durante a general session da tarde, Bob Brewin mostrou, junto com um sujeito da NASA, um projeto muito legal chamado NASA World Wind, que é uma API que pode ser usada na sua aplicação e permite fazer coisas a la Google Earth. Bem ridícula de usar, por sinal e impressionante ao mesmo tempo. Foi mostrada também uma applet que permite edição de fotos online.

Depois fui a uma session sobre a JSR-296, o Swing Application Framework, da qual faço parte do Expert Group. Meu objetivo era ver como o NetBeans suporta a JSR e fiquei bastante impressionado; muita coisa já foi feita na ferramenta, e bem feita, por sinal. Na palestra de EJB 3.1 foram mostradas algumas das funcionalidades sendo consideradas, incluindo:

  • Eliminação da necessidade de se ter uma interface para o componente
  • Permitir que EJBs sejam empacotados no próprio war, junto com os componentes web
  • Criar um modelo assíncrono, suportando inclusive sincronia gerenciada pelo bean com synchronized
  • Suporte a singletons
  • Criar um modelo assíncrono, suportando inclusive sincronia gerenciada pelo bean com synchronized
  • Melhorias no suporte a timer, incluindo um modelo declarativo que inicie um timer sozinho no deployment
  • Suporte a stateful webservices

Talvez eles usem a nossa JSR para implementar as melhorias do timer. Isso seria bom, pois faria com que a nova API fosse incluída já no Java EE 6, que deve sair ano que vem.

O BOF do Neal Gafter sobre closures foi meio decepcionante em conteúdo se você já leu o blog dele e a proposal que ele escreveu para adicionar closures ao Java SE 7. Depois teve um BOF com o Alex Buckley e o Peter von der Ahé sobre as mudanças de linguagem que estão sendo consideradas para o Java SE 7, incluindo sobrecarga de operadores. Eu particularmente tenho alguns receios a respeito, mas também entendo que certas coisas seriam bem práticas na nossa JSR, permitindo algo como:

CalendarDay depoisDeAmanha = today() + 2;

Na quarta, começei assistindo a palestra do Gavin King e do Bob Lee sobre o Web Beans. O suporte de injeção de dependências que eles estão planejando é fantástico, uma fusão entre o que o Guice e o Seam suportam. Se tudo der certo, isso vai ser separado da spec e vai poder ser usado no desktop também. Muito bom mesmo.

Nosso BOF a noite foi muito bem-sucedido. Além de termos uma sala relativamente cheia para 10 da noite, o público incluía spec leads interessados em usar a API. Ficamos quase uma hora respondendo perguntas e escutando as sguestões das pessoas para a API. Agradeço ao pessoal do UOL pela presença e em especial ao Sponch pelas fotos. Valeu :-)

Outros destaques foram uma palestra sensacional sobre música, mais especificamente MIDI, com o JFugue, feita pelo seu criador, David Koelle, as duas participações da Fabi (uma delas com o Edgar) e um BOF excelente sobre OutOfMemoryError, do qual não esperava tanto.

Bem, como o tempo é curto, não posso fazer um relato tão extensivo. Para fotos e mais informações, vejam meu blog em inglês.

Fim de semana pre-JavaOne

maio 7th, 2007

Já encontrei uns velhos amigos no JavaOne:

;-)

Também tive uma excelente conversa com o Stephen Colebourne, meu co-líder na JSR-310, sobre closures e muitas outras coisas interessantes e tenho me divertido muito com o Vinícius e a Yara Senger, da Globalcode e o Felipe Leme.

Fiz um post mais completo no meu blog em inglês sobre esse fim de semana.