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.