Tempo de leitura: menos de 1 minuto
Vai mais um pouquinho de Groovy aí? Hoje vou dar mais algumas dicas e truques sobre programação nesta linguagem.
O Groovy disponibiliza alguns recursos bem legais que facilitam muito a vida do programador, como já falei anteriormente em outros posts. Alguns realmente parecem mágica, pois com pouquíssimas linhas de código, conseguimos fazer coisas originalmente trabalhosas. Vejamos algumas então.
Sobrecarga de métodos e construtores
Um bom exemplo desse potencial, é a sobrecarga de métodos e construtores. No Java isso deixa a classe bem poluída, quanto mais métodos ou construtores mais feia a classe fica, vejamos uma exemplo:
[code language=”java”]
…
public MessageBundle(final String pMensagem, final String pChaveCodigo) {
this(pMensagem, pChaveCodigo, "");
}
public MessageBundle(final String pMensagem, final String pChaveCodigo,
final String pParametro1) {
this(pMensagem, pChaveCodigo, pParametro1, "");
}
public MessageBundle(final String pMensagem, final String pChaveCodigo,
final String pParametro1, final String pParametro2) {
mensagem = pMensagem;
chaveCodigo = pChaveCodigo;
parametro1 = pParametro1;
parametro2 = pParametro2;
}
…
[/code]
Nota: No exemplo a cima, existem 3 construtores sobrecarregados.
No Groovy precisamos apenas de um construtor com parâmetros auto inicializados, exemplo:
[code language=”java”]
…
public MessageBundle(final String pMensagem, final String pChaveCodigo,
final String pParametro1 = "", final String pParametro2 = "") {
mensagem = pMensagem;
chaveCodigo = pChaveCodigo;
parametro1 = pParametro1;
parametro2 = pParametro2;
}
…
[/code]
Nota: Na assinatura do método ou construtor, podemos setar um valor default para uma parâmetro, assim dispensa a necessidade de criamos as sobrecargas.
O mais interessante é que se utilizarmos da “auto complete” na IDE, temos a impressão de existir mais de um construtor na classe, no entanto existe apenas um.

Construtor por mapa
Muitas das vezes instanciar um objeto é uma tarefa difícil, principalmente em Java quando o objeto a ser instanciado possui vários atributos. Já falei aqui no blog, sobre alguns técnicas que facilitam a vida do programador na construção de objetos.
No Groovy a estória é outra! Ele possui um recurso muito legal e vário de usar, chamado construtor por mapa. Para utilizar esse recurso, basta a sua classe possuir um construtor acessível (public, protected ou default). Esse tipo de construção é uma mão na roda na elaboração de testes unitários. Vejamos um exemplo:
Considere a seguinte classe (pode ser uma classe Java ou Groovy):
[code language=”java”]
public class Pojo {
private String a;
private String b;
private String c;
private String d;
private String e;
public Pojo() {}
…
}
[/code]
Instanciando a classe Pojo usando Groovy:
[code language=”groovy”]
// basta informar qual o atributo que você deseja inicializar, seguido por dois pontos e o valor.
new Pojo(a: "atributo1", b: "atributo2", c: "atributo3")
//também é possível passar um mapa
def mapaValores = [a: "1", b: "2", c: "3", d: "4", e: "5"]
new Pojo(mapaValores)
[/code]
Instanciando mesma classe Pojo, agora usando Java:
[code language=”java”]
Pojo novoPojo = new Pojo();
novoPojo.setA("1");
novoPojo.setB("2");
novoPojo.setC("3");
novoPojo.setD("4");
novoPojo.setE("5");
[/code]
O que é mais simples em sua opinião?
Operadores
Elvis operator
O “Elvis operator” (?:) é um encurtamento do operador ternário. Mas onde uso isso? Simples, sabe quando termos que testar se a variável é diferente de nula, senão temos que retornar um valor padrão? É justamente aí que este operador ajuda. Vejamos um exemplo:
[code language=”groovy”]
//como se faz usando if ternário
def nome = usuario.nome ? usuario.nome : "anonimo"
// usando "Elvis operator"
def nome = usuario.nome ?: "anonimo"
[/code]
Nota: Usando “Elvis operator” não precisamos informar qual é o retorno se condição for true, pois assumo o valor da própria condição. Outro ponto importante é, se usamos uma String na condição, a condição retornará false, quando a mesmo for nula ou vazia.
Vendo o exemplo a cima, qual vocês acham que seria o retorno se fizermos isso?
[code language=”groovy”]
def nome = usuario.nome != null ?: "anonimo"
// nesse caso, se usuario.nome for diferente de nulo,
// a variável "nome" receberia o valor "true",
// por tanto tome cuidado com o retorno na condição.
[/code]
Safe navigation operator (Operador de Navegação Segura)
O “safe navigation operator” (?.) é usado para evitar NullpointerException. Quando você precisar garantir que um objeto não está nulo para acessar um de seus atributos, use este operador sem moderação.
[code language=”groovy”]
// caso o objeto usuário esteja nulo,
// a variável "nome" receberá o valor null.
def nome = usuario?.nome
[/code]
Nota: Ao usar o operador ?, você deixará de usar alguns IFs, deixando seu código mais legível.
Direct field access operator (Operador de acesso direto)
Toda vez Groovy que precisamos obter o valor um atributo publico, o Groovy usa o getter para o atributo. Supondo que getter não retorne o valor o atributo, mas sim um literal (como abaixo), se precisarmos o valor do atributo usamos o operador “direct field access operator” (.@). Exemplo:
[code language=”groovy”]
// classe usuário
class Usuario {
public final String nome
Usuario(String nome) { this.nome = nome}
//não retorno o valor do atributo, mas sim um literal
String getNome() { "Nome: $nome" }
}
…
// acessando o atributo diretamente.
assert usuario.@nome == ‘Eder’
[/code]
Spread operator (Operador de propagação)
O “spread operator” (*.) é usado para chamar uma ação em todos os itens de um objeto agregado numa collection. É equivalente a chamar a ação em cada item e recolher o resultado em uma lista:
[code language=”groovy”]
class Carro {
String marca
String modelo
}
def carros = [
new Carro(marca: ‘Peugeot’, modelo: ‘508’),
new Carro(marca: ‘Honda’, modelo: null),
new Carro(marca: ‘Renault’, modelo: ‘Clio’)
]
def marcas = carros*.marca
assert marcas == [‘Peugeot’, ‘Honda’, ‘Renault’]
def modelos = carros*.modelo
assert modelo == [‘508’, null, ‘Clio’]
[/code]
E aí? O que acharam?
Até a próxima pessoal!
Fonte: Groovy – Operators
Link permanente