GROOVY Diogo Eládio Igor Como surgiu? Primeiro sinal de vida foi dado por James Strachan em seu blog em agosto de 2003. Várias versões foram lançadas entre 2004 e 2006, porém somente depois do processo de padronização JCP foi adotado a versão “1.0”, lançada em janeiro de 2007 (beta). Versão 1.1 Final foi lançada em dezembro do mesmo ano, porém logo foi rebatizada de 1.5 devida as grandes modificações. A versão atual é a 1.7. O que é? Groovy é uma linguagem ágil e dinâmica que roda sobre a JVM. Adiciona ferramentas fortes e modernas sobre o Java, inspiradas em linguagens como Python, Ruby e Smalltalk. Pode ser usada interpretada como um script ou compilada pelo groovyc. Assim como Java, Groovy também é OO, porém também pode-se programar de forma procedural com a mesma. Recursos/Vantagens Suporte nativo a Closures: como se fosse uma função mais livre de variáveis. Nela pode-se passar variáveis que podem não estar definidas na assinatura. Exemplo: def soma = { x , y -> println x + y } soma 3, 5 DRY (Don’t Repeat Yourself): evita repetição desnecessária de código. Exemplo: você faz uma classe, adiciona uma variável e não precisa fazer getter e setter para a mesma, entre vários outros usos. Exemplo2: public class Pessoa { def nome, idade; String toString() { "Nome: ${nome} idade: ${idade}” } } p = new Pessoa(nome: “Joao”, idade: 20) println p Duck Typing: diminui a quantidade de código que precisa digitar, faz o código mais legível e flexível. GStrings: uso do operador $ para resolver uma variável ou expressão dentro de uma String. Suporte nativo a Mapas (tipo que que permite mapear dados, ligando um valor a outro) e Listas. Exemplo: def mapa = [1: “Joao”, 2: “Maria”] mapa += [3: “Jose”] mapa.each{ println “Chave: ${it.key} - valor: ${it.value}” } Operadores: adicionam agilidade para o código, podem ser usados inclusive com classes. Exemplo: class Pessoa{ def nome, filho def rightShift(f){ filho = f } } def p1 = new Pessoa(nome: “Joao”) def p2 = new Pessoa(nome: “Jose”) p1 >> p2 Operações null-safe: evita Null Pointer Exception automaticamente. Basta apenas colocar o ? na frente. Entre outras funcionalidades. Mais referência para estudo: http: //groovy.codehaus.org/ Diferenças entre Groovy e outras linguagens Diferença entre Groovy e Java Como o Groovy é uma linguagem compatível com Java, por esse motivo é muito comum que as pessoas pensem as duas linguagens são idênticas, contudo existem algumas diferenças significativas. No Groovy, inúmeras classes e pacotes são importados automaticamente (default) tais quais: java.io.* java.lang.* java.math.BigDecimal java.math.BigInteger java.net.* java.util.* groovy.lang.* groovy.util.* Algumas situações que um desenvolvedor Java pode ser induzido ao erro ao iniciar o desenvolvimento em Groovy: ● “= =” significa “igual” para todos os tipos. Diferentemente do Java que para os tipos primários representa igualdade e para os Objetos identidade. Ou seja, não há a necessidade de usar equals(), pode-se utilizar diretamente o comando “= =” ● “in” é uma palavra chave, portanto não pode-se usá-la para nomear variáveis. ● Para declarar um array, em vez de escrever int a [] = {1, 2, 3} é preciso escrever: int a[] = [1, 2, 3] ● Forma de simplificação do comando de looping “for”; enquanto no java você precisa declarar o for da seguinte forma: for(int i=0; i<length-1; i++) { } no Groovy, pode se fazer também dessa forma, mas pode usar de uma simplificação sendo esta: for(i in 0..<length-1) { } ou até mesmo uma forma ainda mais simplificada: length.times { } Algumas coisas que é interessante saber: ● A finalização das linhas com ponto e vírgula é opcional. ● O uso da palavra-chave “return” também é opcional. ● Pode-se usar a palavra-chave “this” dentro de métodos estáticos (aqueles que referenciam classes) ● Métodos e classes são públicas (public) em seu estado default. ● a cláusula “throws” não é interpretada pelo compilador groovy, uma vez que não existe diferenciação entre exceções verificadas e não verificadas. Novidades no Groovy inexistente no java: ● Closure. ● Sintaxe nativa para listas e mapas. ● Interação polifórmica no switch-case. ● Tipo dinâmico ou estático são aceitáveis, por isso pode-se omitir o tipo na hora de declarar métodos ou variáveis. ● Pode-se embutir expressões lógicas dentro de um String. ● Sintaxe simplificada para escrever beans, com facilidade de adição e manipulação nas propriedades de eventos listeners. Diferenças entre Groovy e Python Geral: Python Groovy repr(x) x.inspect(), x.dump() x.y if x else None x?.y Extraído de groovy.codehaus.org (21 de junho 2010) Diferenças entre Groovy e Python Python Groovy not x !x x.empty len(x) x.size() Extraído de groovy.codehaus.org (21 de junho 2010) Diferenças entre Groovy e Python Python Groovy m = 'strip'; getattr(' ! ', m)() m = 'trim'; ' ! '."$m"() args = ('a', 2); 'abcabc'.find(*args) args = ['a', 2]; 'abcabc'.indexOf (*args) Extraído de groovy.codehaus.org (21 de junho 2010) Diferenças entre Groovy e Ruby Existe uma grande similaridade entre o Groovy e Ruby, ambos utilizam de programação abstrata, em que tudo é um objeto. O Ruby usa o Ruby Library, o Groovy utiliza o Java Library, com algumas adições necessárias. As diferenças são poucas, contudo deve-se ter um cuidado especial, dos os desenvolvedores Ruby que estão migrando para Groovy, principalmente ao que tange a sintaxe dos closures. Grails É um framework com intuito de otimizar a produtividade dos aplicativos WEB na linguagem Groovy. Utiliza o paradígma de programação "programação por convenção" o qual, minimiza o contato do desenvolvedor com a parte sintática e detalhes profundos na programação. Dessa forma o desenvolvedor tem disponível mais tempo com a execução da lógica e assim aumenta a produtividade Foi renomeado de Groovy on Rails para Grails após pedidos formais do desenvolvedor do projeto Ruby on Rails. Grails Versão 0.1 em março/2006 Framework para aplicações WEB Alta Produtividade Usa Hibernate, Spring GORM - Grails Object Relational Mapping Scaffolding Referências Bibliográficas Capítulo "From Java to Groovy" do Livro Groovy and Grails Recipes, Bashar Abdul-Jawad, 2009. Capítulo "Getting Started with Groovy" do Livro Groovy and Grails Recipes, Bashar Abdul-Jawad, 2009. Capítulo "Groovy Data types and Control Structures" do Livro Groovy and Grails Recipes, Bashar Abdul-Jawad, 2009. Capítulo "Rapid Web Development Using Groovy and Grails" do Livro Spring Persistence A Running Start, Paul Tepper Fisher and Soloman Duskis, 2009 http://groovy.codehaus.org acessado em Junho de 2010.