04 junho 2008

Java Generics chateia desenvolvedores: muito código!


Aos que acompanham o framework web Apache Wicket, devem ter notado que o branch 1.4 progrediu para ser compatível somente com Java 5 e superior. Isto significa uma evolução, não apenas na minha opinião mas na de muitos outros usuários da Wicket User List e é claro a dos committers. Deste modo, novos métodos, classes e sintaxes podem ser utilizadas pelo framework, reduzindo seu código no Core e facilitando o seu uso. Até a versão 1.3.x, o framework era dividido entre módulos com suporte até Java 1.4, e outros somente para Java 5 e superiores, como o Wicket Spring Annotations. Hoje, todos os módulos que eram separados desta forma, foram unidos e hoje temos somente, por exemplo, Wicket Spring (já com as anotações lá dentro.) Veja as novidades aqui.

Fora as novidades comuns do Java 5, praticamente todo o framework foi generalizado, pois devido a duas classes importantes, a Component e a IModel, serem diretamente relacionadas e sendo esta última, a que provê os dados para a Component, o uso de Generics foi aplicado, tornando estas como: IModel<T> e Component<T>. Isto implicou em mudanças em diversas partes do código é lógico. Métodos como:

  • T IModel.getObject();
  • T Component.getModelObject();
  • Model<T> Component.getModel();
introduziram o conceito de Generics de forma elegante, pois agora o tipo do objeto contido no IModel, e consequentemente no Component, era conhecido - type-safe. Porém, após muitos migrarem seus aplicativos para a nova versão, começou-se uma longa discussão a respeito das reais vantagens do uso do Java Generics. Muita gente começou a reclamar da quantidade de vezes que era necessário declarar o tipo, como no exemplo abaixo:

TextField<String> txtNome = new TextField<String>("nome", new PropertyModel<String>(usuario, "primeiroNome"));

Tudo isso para ter estas facilidades:

String nome = txtNome.getModelObject(); // type safe cast
String nome2 = txt.getModel().getObject(); // type safe cast

Generics começou então a torrar a paciência de muita gente que até então, adorava o framework pela sua simplicidade e modelo Java puro que nos levava até a obter uma certa diversão na codificação. Conclusão: Generics deixou o framework chato de codificar. Ter que indicar 3 vezes que o component vai mostrar uma String, é insano.

A discussão começou na Wicket Dev List no dia 07 de Março deste ano, pelo Eelco que questionou justamente o que coloquei de exemplo aqui, como vocês podem ler aqui. Sua preocupação não foi em vão, entretanto. Outras discussões nasceram sobre diversos outros casos onde a redundância de tipagem chateava o desenvolvedor. O assunto tomou proporções absurdas quando decidiram questionar os usuários do framework na User List. A discussão iniciada em 01 de Junho pelo próprio Eelco, entitulada "users, please give us your opinion: what is your take on generics with Wicket" já consta com mais de 180 respostas de todos os tipos: usuários chateados, contentes, com sugestões ou desaprovações totais ao uso de Generics.

No dia 2 de Junho, Jonathan Locke postou em seu blog o artigo "Wicket and generics and the end of Java" que causou uma repercusão absurda no The Server Side, com mais de 100 respostas, até algumas calorosas, sobre o uso ou mau uso de Generics.

Hoje, não se tem ainda a conclusão do quê a galera do Wicket vai fazer a respeito de Generics no Core, mas se lermos as discussões citadas acima, fica claro o descontentamento dos desenvolvedores Java com a verbosidade absurda que Generics introduziu no código. A última que lí é que pelo menos no Java 7, isto já será possível:

Bar<Foo> bar = new Bar(fooObject);
Foo foo = bar.getObject();

Se resolve todos os problemas? Definitivamente não. Ainda tem muita coisa para ser discutida. Talvez no Java 9 fica pronto! :-)

[]'s!

5 comentários:

Anônimo disse...

Bruno Borges,
Muito interessante esse post. Realmente é para se pensar sobre o assunto. Ainda não tive a oportunidade de utilizar o Wicket, apesar de boas referências. Mas por indicação de uma amigo também estou acompanhando a discussão. E realmente até que ponto o Generics simplificou o desenvolvimento? Sim, com certeza simplificou, mas isso só apenas depois de sobrecarregar a sintaxe e consequentemente nossas vidas.
Ficamos na torcida para uma evolução do uso de Generics pelo Java. E que venha antes do Java 9.

Unknown disse...

Mais uma razão pra usar Scala, onde seu exemplo poderia ser:

var txtNome = new TextField("nome", new PropertyModel(usuario, "primeiroNome")


com o mesmo grau de type-safety.

marcospereira disse...

Não conheço o Wicket, mas será que é possível criar alguns factory methods para ter código assim:

TextField[String] txt = textfield("nome", usuario, "primeiroNome");

ps.: com "[" porque o blogger reclama.

valeuz...

Anônimo disse...

Excelente post Bruno, estou começando a desenvolver um site usando Wicket, aqui onde trabalho e isto me esclareceu muitas duvidas.
Agora, você conhece alguma comunidade Nacional de usuários do Wicket ?

Bruno Borges disse...

Marco, é até possível criar os factory methods, mas é impraticável pois há uma série de construtores, e também isso atrapalharia na especialização de componentes, já que estes métodos devem ser estáticos. :(

Contato

Email:bruno.borges(at)gmail.com

LinkedIn: www.linkedin.com/in/brunocborges
Twitter: www.twitter.com/brunoborges
Comprei e Não Vou
Rio de Janeiro, RJ Brasil
Oracle
São Paulo, SP Brasil