SlideShare uma empresa Scribd logo
1 de 33
Grails - Destaques
...para quem já sabe Java
Douglas de Oliveira Mendes
Grails - Destaques
Baseado no livro "Programming Grails" de Burt
Beckwith
Groovy + Spring + Hibernate + "Convention
over configuration" + ...
Esta apresentação é mais focada na diferença do código-fonte, mas saiba que
Grails juntou muito bem frameworks bastante utilizados pela comunidade Java
(especialmente Spring e Hibernate).
Graças ao dialeto Groovy e à prática de "convenção sobre configuração" o
resultado é um código-fonte bem mais conciso.
Vamos ao que interessa...
"Reflection" fácil de usar
String methodName = …
def value = person."$methodName"(1, 2)
String propertyName = …
def otherValue = person."$propertyName"
Mapas são LinkedHashMap
...ao invés de java.util.HashMap para assim
manter a ordem dos elementos.
def map = [red:1, blue:2]
Se precisar de outro tipo de mapa é só
instanciar como é feito no Java.
Getters e setters
Basta acessar a propriedade diretamente. Ex.:
cliente.nome
O getter vai ser invocado quando estiver lendo
o valor e o setter quando estiver atribuindo um
novo valor.
Getters e setters
Não é necessário (mas é permitido e serão
chamados se existirem) implementar métodos
getters e setters. Ex.:
void setNome(String nome) {
this.nome = nome.trim();
}
Debaixo do capô
AST Browser
JD-GUI
Para entender o código gerado.
Closure
Pedaço de código que pode ser atribuído a uma
variável. Pode ser passado como parâmetro e
invocado dentro de métodos.
Lembra uma classe anônima porém sem
precisar implementar uma Interface. Nota: eles
podem acessar variáveis não "final" fora de seu
escopo.
Closure
Ex.:
def hello = { println "hello" }
hello()
Closure
É um jeito prático de implementar interfaces
sem precisar definir todos os métodos (útil em
testes por exemplo):
def conn = [
close: { -> println "closed},
setAutoCommit: { boolean autoCommit -> println "autoCommit:
$autoCommit" }
] as java.sql.Connection
Closure
Trabalhando com parâmetros:
def add { int x, int y -> x + y }
getMaximumNumberofParameters()
getParameterTypes()
Loops
int count = someCalculation()
for (int i = 0; i < count; i++) {
…
}
Loops
someCalculation().times {
…
}
Loops
for (i in 0..someCalculation() - 1) {
…
}
Comparando objetos
O sinal "==" funciona diferente do Java pois ele
compara os valores.
Para saber se ambas as referências apontam
para o mesmo objeto, utilizar:
foo.is(bar)
Invocação de método de acordo com
tipo to parâmetro
void close(Connection c) {
…
}
void close(Object o) {
...
}
Invocação de método de acordo com
tipo to parâmetro
No Java este código invocaria close(Object):
Object connection = createConnection();
close(connection);
No groovy seria chamado o close(Connection)
porque seria resolvido em Runtime.
Groovy Strings
Multilinhas (com três aspas):
def name = "Carl Sagan"
def texto = """
Caro $name,
Não esqueça de alimentar os gatinhos."""
'this' funciona para acesso estático
ex.:
private static final Logger LOG = Logger.getLogger(this)
Metaprogramming
Adicionando um método:
List.metaClass.removeRight = {
int index -> delegate.remove(delegate.size() - 1 - index)
}
Metaprogramming
É possível sobrescrever métodos como:
- invokeMethod
- getProperty
- setProperty
- methodMissing
- propertyMissing
Metaprogramming
Ex. de sobrescrita do invokeMethod:
def methodMissing(String methodName, args) {
println "papagaio - $methodName"
}
Operadores: ?.
Acesso null-safe (se "person" for null o valor
atribuído será null ao invés de dar
NullPointerException):
String name = person?.name
Operadores: ?:
?: é operador "Elvis" que encurta ternários. Você já fez algo
assim em Java?
Integer qtd = qtdParam ? qtdParam : 10
Com grails você pode fazer assim:
Integer qtd = qtdParam ?: 10
Operadores: *.
*. é o "spread". Se você quer todos os nomes de
clientes de um array você pode fazer assim:
String[] nomes = clientes*.nome
Operadores: .@
Como já vimos, ao acessar "cliente.nome" o método
getNome (ou setNome se for atribuição) é chamado
automaticamente.
Se desejar evitar por exemplo o getNome e acessar
diretamente a propriedade, utilize o operador .@. Ex.:
cliente.@nome
Operadores: as
Facilita escolha do tipo de estrutura de dados. Por ex. criar
um Set ao invés de um List:
def things = ['a', 'b', 'b', 'c'] as Set
assert things.getClass().simpleName == 'HashSet'
assert things.size() == 3
Operadores: in
Similar a chamar o método "contains":
assert 1 in [1, 2, 5]
Operadores: .&
Permite tratar um método como um closure
(podendo assim passar a referência do método
como parâmetro). Ex.:
def add = new MathUtils().&add
add(x, y)
Operadores: sobrecarga
Basta implementar os respectivos métodos:
a + b -> a.plus(b)
a++ -> a.next()
a << b -> a.leftShift(b)
...
Groovy "demais"...
def foo = bar(5, true) // o que é "foo"??
def fazAlgo() {...} // O que fazAlgo retorna? É void? Por que
não declará-lo como void?
def fazAlgo = {} // Definir métodos como closure ao invés
da declaração normal pode fazê-lo ficar de fora de
interceptações como por exemplo quando o Spring está
marcando os métodos como transacionais.
Linguagem dinâmica permite mais
bugs...
int hc = someObject.hashcode()
Se o método na verdade se chama hashCode só saberemos
na hora que o código for executado, não quando for
compilado. Testes deveriam nos prevenir destes casos.
As anotações @TypeChecked e @CompileStatic ajudam
nestes casos e melhoram desempenho do código porém há
perda de flexibilidade (por ex. metaprogramming).

Mais conteúdo relacionado

Mais procurados

Javascript para CSharpers 3 - Conceitos
Javascript para CSharpers 3 - ConceitosJavascript para CSharpers 3 - Conceitos
Javascript para CSharpers 3 - ConceitosWesley Lemos
 
Passagem de Objetos entre Java e Oracle
Passagem de Objetos entre Java e OraclePassagem de Objetos entre Java e Oracle
Passagem de Objetos entre Java e OracleAndré Reis
 
Spock Framework
Spock FrameworkSpock Framework
Spock FrameworkIsmael
 
Iniciando com javaScript 2017
Iniciando com javaScript 2017Iniciando com javaScript 2017
Iniciando com javaScript 2017Romualdo Andre
 
introdução a linguagem java-2003
introdução a linguagem java-2003introdução a linguagem java-2003
introdução a linguagem java-2003elliando dias
 
Mobileconf dicas-android
Mobileconf dicas-androidMobileconf dicas-android
Mobileconf dicas-androidAlberto Souza
 
Javascript para CSharpers - Append B - jQuery
Javascript para CSharpers - Append B - jQueryJavascript para CSharpers - Append B - jQuery
Javascript para CSharpers - Append B - jQueryWesley Lemos
 
Desenvolvimento em .Net - nHibernate
Desenvolvimento em .Net - nHibernateDesenvolvimento em .Net - nHibernate
Desenvolvimento em .Net - nHibernateVitor Silva
 
Spock Framework 2
Spock Framework 2Spock Framework 2
Spock Framework 2Ismael
 
Objetos Pythonicos - compacto
Objetos Pythonicos - compactoObjetos Pythonicos - compacto
Objetos Pythonicos - compactoLuciano Ramalho
 
Python: a primeira mordida
Python: a primeira mordidaPython: a primeira mordida
Python: a primeira mordidaLuciano Ramalho
 
Cheat sheet - String Java (Referência rápida)
Cheat sheet - String Java (Referência rápida)Cheat sheet - String Java (Referência rápida)
Cheat sheet - String Java (Referência rápida)Rafael Liberato
 
Aula actionscript basico
Aula actionscript basicoAula actionscript basico
Aula actionscript basicoWemerson Silva
 

Mais procurados (20)

Javascript para CSharpers 3 - Conceitos
Javascript para CSharpers 3 - ConceitosJavascript para CSharpers 3 - Conceitos
Javascript para CSharpers 3 - Conceitos
 
App scala
App scalaApp scala
App scala
 
Passagem de Objetos entre Java e Oracle
Passagem de Objetos entre Java e OraclePassagem de Objetos entre Java e Oracle
Passagem de Objetos entre Java e Oracle
 
Spock Framework
Spock FrameworkSpock Framework
Spock Framework
 
Iniciando com javaScript 2017
Iniciando com javaScript 2017Iniciando com javaScript 2017
Iniciando com javaScript 2017
 
JavaScript Hacks
JavaScript HacksJavaScript Hacks
JavaScript Hacks
 
OOP ObjC
OOP ObjCOOP ObjC
OOP ObjC
 
introdução a linguagem java-2003
introdução a linguagem java-2003introdução a linguagem java-2003
introdução a linguagem java-2003
 
BDD com Rails
BDD com RailsBDD com Rails
BDD com Rails
 
Mobileconf dicas-android
Mobileconf dicas-androidMobileconf dicas-android
Mobileconf dicas-android
 
Javascript para CSharpers - Append B - jQuery
Javascript para CSharpers - Append B - jQueryJavascript para CSharpers - Append B - jQuery
Javascript para CSharpers - Append B - jQuery
 
Desenvolvimento em .Net - nHibernate
Desenvolvimento em .Net - nHibernateDesenvolvimento em .Net - nHibernate
Desenvolvimento em .Net - nHibernate
 
RMI em Java
RMI em JavaRMI em Java
RMI em Java
 
Spock Framework 2
Spock Framework 2Spock Framework 2
Spock Framework 2
 
Introdução ao MongoDB
Introdução ao MongoDBIntrodução ao MongoDB
Introdução ao MongoDB
 
Objetos Pythonicos - compacto
Objetos Pythonicos - compactoObjetos Pythonicos - compacto
Objetos Pythonicos - compacto
 
Python: a primeira mordida
Python: a primeira mordidaPython: a primeira mordida
Python: a primeira mordida
 
Cheat sheet - String Java (Referência rápida)
Cheat sheet - String Java (Referência rápida)Cheat sheet - String Java (Referência rápida)
Cheat sheet - String Java (Referência rápida)
 
PowerShell
PowerShellPowerShell
PowerShell
 
Aula actionscript basico
Aula actionscript basicoAula actionscript basico
Aula actionscript basico
 

Destaque

Junho 2016 - Django - A sua cápsula de soluções web em python
Junho 2016 - Django - A sua cápsula de soluções web em pythonJunho 2016 - Django - A sua cápsula de soluções web em python
Junho 2016 - Django - A sua cápsula de soluções web em pythonGrupo de Testes Carioca
 
Minicurso Play Framework - Tão fácil que nem parece Java
Minicurso Play Framework - Tão fácil que nem parece JavaMinicurso Play Framework - Tão fácil que nem parece Java
Minicurso Play Framework - Tão fácil que nem parece JavaWandesson Soares
 
Desenvolvimento web ágil com Python e web2py #qconsp #qcon
Desenvolvimento web ágil com Python e web2py #qconsp #qconDesenvolvimento web ágil com Python e web2py #qconsp #qcon
Desenvolvimento web ágil com Python e web2py #qconsp #qconBruno Rocha
 
Minicurso grails
Minicurso grailsMinicurso grails
Minicurso grailsNatã Melo
 
Desenvolvimento web com groovy e grails.
Desenvolvimento web com groovy e grails.Desenvolvimento web com groovy e grails.
Desenvolvimento web com groovy e grails.Bryan Ollivie
 
O que esperar do Codeigniter 4
O que esperar do Codeigniter 4O que esperar do Codeigniter 4
O que esperar do Codeigniter 4Jonathan Lamim
 
Curso de web2py - Apresentação
Curso de web2py - ApresentaçãoCurso de web2py - Apresentação
Curso de web2py - ApresentaçãoJúlia Rizza
 
CakePHP com sotaque brasileiro
CakePHP com sotaque brasileiroCakePHP com sotaque brasileiro
CakePHP com sotaque brasileiroJuan Basso
 
Python storm grupy_sp_23_04
Python storm grupy_sp_23_04Python storm grupy_sp_23_04
Python storm grupy_sp_23_04Eric Hideki
 
Infoeste 2014 - Desenvolvimento de um CMS com Codeigniter Framework(PHP)
Infoeste 2014 - Desenvolvimento de um CMS com Codeigniter Framework(PHP)Infoeste 2014 - Desenvolvimento de um CMS com Codeigniter Framework(PHP)
Infoeste 2014 - Desenvolvimento de um CMS com Codeigniter Framework(PHP)Rafael Oliveira
 
Iniciando com o PHP e conhecendo Codeigniter
Iniciando com o PHP e conhecendo CodeigniterIniciando com o PHP e conhecendo Codeigniter
Iniciando com o PHP e conhecendo CodeigniterRenan Martins Pimentel
 
Desenvolvimento Web com CakePHP
Desenvolvimento Web com CakePHPDesenvolvimento Web com CakePHP
Desenvolvimento Web com CakePHPSérgio Vilar
 
Frameworks Opensource: ferramentas para desenvolvimento rápido de aplicações Web
Frameworks Opensource: ferramentas para desenvolvimento rápido de aplicações WebFrameworks Opensource: ferramentas para desenvolvimento rápido de aplicações Web
Frameworks Opensource: ferramentas para desenvolvimento rápido de aplicações WebJairo Junior
 
Spring roo produtividade no java
Spring roo produtividade no javaSpring roo produtividade no java
Spring roo produtividade no javaPedro Cavalero
 
Rapida apresentacao sobre o Grails
Rapida apresentacao sobre o GrailsRapida apresentacao sobre o Grails
Rapida apresentacao sobre o GrailsDiego Cavalcanti
 
JBoss Forge - Desenvolvimento Rápido de Aplicações Java
JBoss Forge - Desenvolvimento Rápido de Aplicações JavaJBoss Forge - Desenvolvimento Rápido de Aplicações Java
JBoss Forge - Desenvolvimento Rápido de Aplicações JavaLeandro Storoli
 
Intro - Ruby e Ruby on Rails
Intro - Ruby e Ruby on RailsIntro - Ruby e Ruby on Rails
Intro - Ruby e Ruby on RailsGabriel Pereira
 
Produtividade na web_com_groovy_e_grails_pt2
Produtividade na web_com_groovy_e_grails_pt2Produtividade na web_com_groovy_e_grails_pt2
Produtividade na web_com_groovy_e_grails_pt2Lucas Aquiles
 
Desenvolvimento para a Web com CakePHP
Desenvolvimento para a Web com CakePHPDesenvolvimento para a Web com CakePHP
Desenvolvimento para a Web com CakePHPMarcelo Andrade
 

Destaque (20)

Junho 2016 - Django - A sua cápsula de soluções web em python
Junho 2016 - Django - A sua cápsula de soluções web em pythonJunho 2016 - Django - A sua cápsula de soluções web em python
Junho 2016 - Django - A sua cápsula de soluções web em python
 
Minicurso Play Framework - Tão fácil que nem parece Java
Minicurso Play Framework - Tão fácil que nem parece JavaMinicurso Play Framework - Tão fácil que nem parece Java
Minicurso Play Framework - Tão fácil que nem parece Java
 
Desenvolvimento web ágil com Python e web2py #qconsp #qcon
Desenvolvimento web ágil com Python e web2py #qconsp #qconDesenvolvimento web ágil com Python e web2py #qconsp #qcon
Desenvolvimento web ágil com Python e web2py #qconsp #qcon
 
Minicurso grails
Minicurso grailsMinicurso grails
Minicurso grails
 
Desenvolvimento web com groovy e grails.
Desenvolvimento web com groovy e grails.Desenvolvimento web com groovy e grails.
Desenvolvimento web com groovy e grails.
 
O que esperar do Codeigniter 4
O que esperar do Codeigniter 4O que esperar do Codeigniter 4
O que esperar do Codeigniter 4
 
Curso de web2py - Apresentação
Curso de web2py - ApresentaçãoCurso de web2py - Apresentação
Curso de web2py - Apresentação
 
CakePHP com sotaque brasileiro
CakePHP com sotaque brasileiroCakePHP com sotaque brasileiro
CakePHP com sotaque brasileiro
 
Python storm grupy_sp_23_04
Python storm grupy_sp_23_04Python storm grupy_sp_23_04
Python storm grupy_sp_23_04
 
Infoeste 2014 - Desenvolvimento de um CMS com Codeigniter Framework(PHP)
Infoeste 2014 - Desenvolvimento de um CMS com Codeigniter Framework(PHP)Infoeste 2014 - Desenvolvimento de um CMS com Codeigniter Framework(PHP)
Infoeste 2014 - Desenvolvimento de um CMS com Codeigniter Framework(PHP)
 
Iniciando com o PHP e conhecendo Codeigniter
Iniciando com o PHP e conhecendo CodeigniterIniciando com o PHP e conhecendo Codeigniter
Iniciando com o PHP e conhecendo Codeigniter
 
Desenvolvimento Web com CakePHP
Desenvolvimento Web com CakePHPDesenvolvimento Web com CakePHP
Desenvolvimento Web com CakePHP
 
Grails
GrailsGrails
Grails
 
Frameworks Opensource: ferramentas para desenvolvimento rápido de aplicações Web
Frameworks Opensource: ferramentas para desenvolvimento rápido de aplicações WebFrameworks Opensource: ferramentas para desenvolvimento rápido de aplicações Web
Frameworks Opensource: ferramentas para desenvolvimento rápido de aplicações Web
 
Spring roo produtividade no java
Spring roo produtividade no javaSpring roo produtividade no java
Spring roo produtividade no java
 
Rapida apresentacao sobre o Grails
Rapida apresentacao sobre o GrailsRapida apresentacao sobre o Grails
Rapida apresentacao sobre o Grails
 
JBoss Forge - Desenvolvimento Rápido de Aplicações Java
JBoss Forge - Desenvolvimento Rápido de Aplicações JavaJBoss Forge - Desenvolvimento Rápido de Aplicações Java
JBoss Forge - Desenvolvimento Rápido de Aplicações Java
 
Intro - Ruby e Ruby on Rails
Intro - Ruby e Ruby on RailsIntro - Ruby e Ruby on Rails
Intro - Ruby e Ruby on Rails
 
Produtividade na web_com_groovy_e_grails_pt2
Produtividade na web_com_groovy_e_grails_pt2Produtividade na web_com_groovy_e_grails_pt2
Produtividade na web_com_groovy_e_grails_pt2
 
Desenvolvimento para a Web com CakePHP
Desenvolvimento para a Web com CakePHPDesenvolvimento para a Web com CakePHP
Desenvolvimento para a Web com CakePHP
 

Semelhante a Grails - Destaques (para quem já sabe Java)

Semelhante a Grails - Destaques (para quem já sabe Java) (20)

Grails parte 1 - introdução
Grails   parte 1 - introduçãoGrails   parte 1 - introdução
Grails parte 1 - introdução
 
Groovy grails
Groovy grailsGroovy grails
Groovy grails
 
Curso Java Básico - Aula 03
Curso Java Básico - Aula 03Curso Java Básico - Aula 03
Curso Java Básico - Aula 03
 
Evento Front End SP - Organizando o Javascript
 Evento Front End SP - Organizando o Javascript Evento Front End SP - Organizando o Javascript
Evento Front End SP - Organizando o Javascript
 
Curso mongo db com php
Curso mongo db com phpCurso mongo db com php
Curso mongo db com php
 
Aula5
Aula5Aula5
Aula5
 
As Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPontoAs Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPonto
 
Código Limpo
Código LimpoCódigo Limpo
Código Limpo
 
Java 05 Oo Basica
Java 05 Oo BasicaJava 05 Oo Basica
Java 05 Oo Basica
 
JQuery
JQuery JQuery
JQuery
 
Working with legacy code 3
Working with legacy code 3Working with legacy code 3
Working with legacy code 3
 
Linguagens Poo
Linguagens PooLinguagens Poo
Linguagens Poo
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScript
 
DDD > Experiências
DDD > ExperiênciasDDD > Experiências
DDD > Experiências
 
java_avancado.pdf
java_avancado.pdfjava_avancado.pdf
java_avancado.pdf
 
Minicurso groovy grails
Minicurso groovy grailsMinicurso groovy grails
Minicurso groovy grails
 
Fluxo dinâmicos usando spring aplication
Fluxo dinâmicos usando spring aplicationFluxo dinâmicos usando spring aplication
Fluxo dinâmicos usando spring aplication
 
Refactoring
RefactoringRefactoring
Refactoring
 
Linguagem R
Linguagem RLinguagem R
Linguagem R
 
Fundamentos de JDBC
Fundamentos de JDBCFundamentos de JDBC
Fundamentos de JDBC
 

Grails - Destaques (para quem já sabe Java)

  • 1. Grails - Destaques ...para quem já sabe Java Douglas de Oliveira Mendes
  • 2. Grails - Destaques Baseado no livro "Programming Grails" de Burt Beckwith
  • 3. Groovy + Spring + Hibernate + "Convention over configuration" + ... Esta apresentação é mais focada na diferença do código-fonte, mas saiba que Grails juntou muito bem frameworks bastante utilizados pela comunidade Java (especialmente Spring e Hibernate). Graças ao dialeto Groovy e à prática de "convenção sobre configuração" o resultado é um código-fonte bem mais conciso. Vamos ao que interessa...
  • 4. "Reflection" fácil de usar String methodName = … def value = person."$methodName"(1, 2) String propertyName = … def otherValue = person."$propertyName"
  • 5. Mapas são LinkedHashMap ...ao invés de java.util.HashMap para assim manter a ordem dos elementos. def map = [red:1, blue:2] Se precisar de outro tipo de mapa é só instanciar como é feito no Java.
  • 6. Getters e setters Basta acessar a propriedade diretamente. Ex.: cliente.nome O getter vai ser invocado quando estiver lendo o valor e o setter quando estiver atribuindo um novo valor.
  • 7. Getters e setters Não é necessário (mas é permitido e serão chamados se existirem) implementar métodos getters e setters. Ex.: void setNome(String nome) { this.nome = nome.trim(); }
  • 8. Debaixo do capô AST Browser JD-GUI Para entender o código gerado.
  • 9. Closure Pedaço de código que pode ser atribuído a uma variável. Pode ser passado como parâmetro e invocado dentro de métodos. Lembra uma classe anônima porém sem precisar implementar uma Interface. Nota: eles podem acessar variáveis não "final" fora de seu escopo.
  • 10. Closure Ex.: def hello = { println "hello" } hello()
  • 11. Closure É um jeito prático de implementar interfaces sem precisar definir todos os métodos (útil em testes por exemplo): def conn = [ close: { -> println "closed}, setAutoCommit: { boolean autoCommit -> println "autoCommit: $autoCommit" } ] as java.sql.Connection
  • 12. Closure Trabalhando com parâmetros: def add { int x, int y -> x + y } getMaximumNumberofParameters() getParameterTypes()
  • 13. Loops int count = someCalculation() for (int i = 0; i < count; i++) { … }
  • 15. Loops for (i in 0..someCalculation() - 1) { … }
  • 16. Comparando objetos O sinal "==" funciona diferente do Java pois ele compara os valores. Para saber se ambas as referências apontam para o mesmo objeto, utilizar: foo.is(bar)
  • 17. Invocação de método de acordo com tipo to parâmetro void close(Connection c) { … } void close(Object o) { ... }
  • 18. Invocação de método de acordo com tipo to parâmetro No Java este código invocaria close(Object): Object connection = createConnection(); close(connection); No groovy seria chamado o close(Connection) porque seria resolvido em Runtime.
  • 19. Groovy Strings Multilinhas (com três aspas): def name = "Carl Sagan" def texto = """ Caro $name, Não esqueça de alimentar os gatinhos."""
  • 20. 'this' funciona para acesso estático ex.: private static final Logger LOG = Logger.getLogger(this)
  • 21. Metaprogramming Adicionando um método: List.metaClass.removeRight = { int index -> delegate.remove(delegate.size() - 1 - index) }
  • 22. Metaprogramming É possível sobrescrever métodos como: - invokeMethod - getProperty - setProperty - methodMissing - propertyMissing
  • 23. Metaprogramming Ex. de sobrescrita do invokeMethod: def methodMissing(String methodName, args) { println "papagaio - $methodName" }
  • 24. Operadores: ?. Acesso null-safe (se "person" for null o valor atribuído será null ao invés de dar NullPointerException): String name = person?.name
  • 25. Operadores: ?: ?: é operador "Elvis" que encurta ternários. Você já fez algo assim em Java? Integer qtd = qtdParam ? qtdParam : 10 Com grails você pode fazer assim: Integer qtd = qtdParam ?: 10
  • 26. Operadores: *. *. é o "spread". Se você quer todos os nomes de clientes de um array você pode fazer assim: String[] nomes = clientes*.nome
  • 27. Operadores: .@ Como já vimos, ao acessar "cliente.nome" o método getNome (ou setNome se for atribuição) é chamado automaticamente. Se desejar evitar por exemplo o getNome e acessar diretamente a propriedade, utilize o operador .@. Ex.: cliente.@nome
  • 28. Operadores: as Facilita escolha do tipo de estrutura de dados. Por ex. criar um Set ao invés de um List: def things = ['a', 'b', 'b', 'c'] as Set assert things.getClass().simpleName == 'HashSet' assert things.size() == 3
  • 29. Operadores: in Similar a chamar o método "contains": assert 1 in [1, 2, 5]
  • 30. Operadores: .& Permite tratar um método como um closure (podendo assim passar a referência do método como parâmetro). Ex.: def add = new MathUtils().&add add(x, y)
  • 31. Operadores: sobrecarga Basta implementar os respectivos métodos: a + b -> a.plus(b) a++ -> a.next() a << b -> a.leftShift(b) ...
  • 32. Groovy "demais"... def foo = bar(5, true) // o que é "foo"?? def fazAlgo() {...} // O que fazAlgo retorna? É void? Por que não declará-lo como void? def fazAlgo = {} // Definir métodos como closure ao invés da declaração normal pode fazê-lo ficar de fora de interceptações como por exemplo quando o Spring está marcando os métodos como transacionais.
  • 33. Linguagem dinâmica permite mais bugs... int hc = someObject.hashcode() Se o método na verdade se chama hashCode só saberemos na hora que o código for executado, não quando for compilado. Testes deveriam nos prevenir destes casos. As anotações @TypeChecked e @CompileStatic ajudam nestes casos e melhoram desempenho do código porém há perda de flexibilidade (por ex. metaprogramming).