sexta-feira, 1 de junho de 2007

Closures em Java

Aqui há tempos, a trabalhar em Javascript (ECMAScript para os mais puristas) acabei por "descobrir" essa técnica engraçadíssima que são os "closures". Usei-os num "test-case" de algumas técnicas de Javascript num inacabado XML Tree Editor (se se derem ao trabalho de ir ver, são os pequenos ícones de gravar/abandonar que aparecem quando se edita um nó da árvore) e que em termos de código são apenas uma coisa do género
var editOk = new function(){
var i=document.createElement('img');
i.src="images/save.gif";
i.style.verticalAlign="top";
i.onclick=function(){
saveThis(this.previousSibling, name, pos);
}
return i;
}

o que a mim me parece quase magia, pois só com isto o raio dos ícones sabem onde estão, quem são e o que fazer... (a "magia" está, é claro, no "name" e "pos" que são definidos no método exterior).

Realmente, já há muitos anos que eu fazia coisas do género, sem saber que se chamava a isto "closures", em linguagens como dBase/Clipper e LotusScript. Mas que provavelmente eram "side-efects" e não "features"...

E agora parece que já está mais ou menos definido que as "closures" vão também "aparecer" no Java 7. O que abre concerteza mais um campo de batalha propícia a "flame-wars"... É que como não há fome que não dê em fartura, existem não uma, nem duas nem sequer três mas (para já) quatro propostas de implementação. Bom começo!

E está claro que ainda antes de discutir os méritos e a bondade de cada proposta, podia-se ainda discutir coisas como:
  • Mas será que as closures são realmente necessárias?
  • Mas será que as closures são realmente necessárias no Java?
  • Mas afinal as "anonymous inner-classes" não são a mesma coisa?
  • Tá bem, não são, mas não bastam para o que é preciso?
E por aí adiante, é quase "cada cabeça sua sentença"... Já agora dou os meus "dois cêntimos" (de Euro) ao assunto, respondendo às duas primeiras questões na minha perspectiva:
  • Mas será que as closures são realmente necessárias?
Claro, tudo o que se pareça com "magia" é bem-vinda à arte da programação, se não for a magia qualquer dia somos todos "engenheiros"... (oops!)
  • Mas será que as closures são realmente necessárias no Java?
Apesar de as closures virem de tão longe como do Lisp e do Smalltalk, acho muito discutível que as closures possam ser consideradas numa perspectiva de "pure object-oriented". Mas de qualquer modo, Java não é "pure object-oriented"... E sempre fará o pessoal do RoR ficar contente...

E pronto, como podem ver aqui, aqui e acolá, a discussão tem pano para mangas...