Foi disponibilizada recentemente a versão 1.8 estável do Groovy, a linguagem dinâmica que executa sobre a JVM, mantida pela SpringSource. Dentre as novidades, há recursos adicionais para a definição de DSLs (Linguagens Específicas ao Domínio), melhorado significativamente a legibilidade e a expressividade das regras de negócio. Também foi embutido o suporte a JSON, que antes estava disponível apenas através de bibliotecas externas. Outras mudanças foram a incorporação de facilidades para programação concorrente e novas funcionalidades para metaprogramação.
Baseando-se em exemplos do longo e detalhado Release Notes da nova versão, apresentamos a seguir alguns dos principais novos recursos.
1) DSLs mais parecidas com a linguagem natural
Pode ser utilizada uma linguagem praticamente natural em muitas situações. Contribui para isso a flexibilidade de sintaxe do Groovy, pois algumas pontuações (parênteses, pontos e dois-pontos) são opcionais. O código a seguir define uma "DSL" muito simples e a utiliza para obter a raiz quadrada de 100.
/* Os métodos show e square_root são definidos usando closures*/
show = { println it }
square_root = { Math.sqrt(it) }
def please(action) {
[the: { what ->
[of: { n -> action(what(n)) }]
}]
}
O código abaixo equivale a please(show).the(square_root).of(100)
please show the square_root of 100
2) JSON Builder e PrettyPrint
Os Builders do Groovy são um grande facilitador. Este exemplo mostra como utilizar o JsonBuilder para definir uma estrutura JSON:
import groovy.json.*
def json = new JsonBuilder()
json.person {
name "Guillaume"
age 33
pets "Hector", "Felix"
}
println JsonOutput.prettyPrint(json.toString())
A chamada a json.toString() já seria suficiente para mostrar o conteúdo em formato JSON, porém aqui ilustramos o JsonOutput.prettyPrint, que apresenta a saída de forma indentada e estruturada:
{
"person": {
"name": "Guillaume",
"age": 33,
"pets": [
"Hector",
"Felix"
]
}
}
3) Injeção de logs com @Log
Ao utilizar a nova anotação @Log, automaticamente a variável log estará disponível para uso:
import groovy.util.logging.*
@Log<
class Car {
Car() {
log.info 'Car constructed'
}
}
def c = new Car()
3) Método toString() com @ToString
A anotação @ToString automaticamente cria e disponibiliza, usando recursos de metaprogramação, um método toString() com todos os atributos da classe. A saída do exemplo abaixo é Person(Pete, 15):
import groovy.transform.ToString
@ToString
class Person {
String name
int age
}
println new Person(name: 'Pete', age: 15)
4) Programação concorrente com @WithReadLock and @WithWriteLock
É possível definir bloqueios de leitura ou escrita de maneira mais fácil que usando synchronized do Java.
import groovy.transform.*
class ResourceProvider {
private final Map<String, String> data = new HashMap<>()
@WithReadLock
String getResource(String key) {
return data.get(key)
}
@WithWriteLock
void refresh() {
//recarregar os recursos para a memória
}
}
5) Slashy Strings
O recurso de strings em multilinhas aumenta a legibilidade:
String poem = / to be or not to be / assert poem.readLines().size() == 4
Unindo uma sintaxe similar à da linguagem Java à facilidade de desenvolvimento das linguagens dinâmicas, o Groovy vem ganhando popularidade por sua flexibilidade e expressividade. A linguagem tem o suporte dos principais IDEs e vem evoluindo rapidamente. O crescimento em adoção é impulsionado em parte pelo Grails, um framework que facilita o desenvolvimento de aplicações web inspirado no Ruby on Rails.