quarta-feira, abril 14, 2010

Java missed the boat?

Ontem eu estava dando uma olhada no JDK 7 para ver em que pé estava. Queria saber principalmente de closures que, a priori, iam ficar de fora.
Para minha surpresa (tá, tá... cheguei atrasado na festa), estava lá na página da Sun um pequeno artigo sobre closures de Dezembro de 2009 dizendo: "Vamos colocar uma versão de closures simplificada no JDK 7":
... It’s time to learn from the past debate and move forward. Sun will initiate the design and implementation of a simple closures feature, as outlined above, and add it to JDK 7 so as to enable broad experimentation. If all goes well then we’ll later submit a language-change JSR which would, in turn, be proposed as a component of the eventual Java SE 7 JSR. (ênfase minha)
Não entendi nada =/ Depois de tanto afirmarem que não ia, pra que a pressa agora? Colocar closures em Java vai ser um "puta trampo". Não pelos closures em si, mas muito da API deveria ser reescrita ou expandida.
Procurando um pouco mais achei um bug (ID: 5014235) na Sun Developer Network que acho que explica bem o que significa colocarem closures agora.
Closures are a great thing. Unfortunately, Java missed the boat in 1997. Since then, we've added a collections framework without closures (one of the prime uses), built graphics APIs around nested classes etc. We have tons of control constructs that could be defined using closures but aren't (assert and foreach, for example). So the advantage of adding closures now would be relatively small compared to the huge benefit you get if you add them from day one.
(ênfase minha de novo)
Resumo da ópera: o trampo de colocar vai trazer um benefício bem menor que o esperado, já que todos os lugares onde closure seria realmente bom já estão usando outros esquemas.
Se colocarem agora, para não tornar o código anterior incompatível, terão que adicionar vários métodos e maneiras "alternativas" de se fazer as coisas. Não sei vocês, mas acho que isso vai embananar o código, ora com closures, ora sem.
Não me leve a mal, adoro closures e acho que deveriam ser parte essencial de qualquer linguagem, mas colocar elas no Java agora vai dar um tremendo trabalho e quebrar a integridade conceitual da coisa (popular: "bagunçar o coreto").
Quer closures, gosta da JVM e de tipagem estática? Vai pro Scala que você vai estar mais bem servido e com uma linguagem conceitualmente consistente. De quebra, você ainda ganha type inference, currying, pattern matching, operator overloading (hmmm... na verdade é notação infix, mas dá na mesma), imutabilidade fácil e mais um paco de técnicas realmente úteis para programar.
Muito tarde para o Java.