SlideShare a Scribd company logo
Groovy 2.0
  Quoi de neuf, doc ?
Guillaume Laforge         Cédric Champeau
Groovy Project Manager   Groovy Core Committer
      @glaforge             @cedrichampeau




                                                 1
Groovy 2.0
  Quoi de neuf, doc ?
Guillaume Laforge         Cédric Champeau
Groovy Project Manager   Groovy Core Committer
      @glaforge             @cedrichampeau




                                                 1
Guillaume Laforge
•   Groovy Project Manager at VMware
    •Initiator of the Grails framework
    •Creator of the Gaelyk
     and Caelyf toolkits

•   Co-author of Groovy in Action


•   Follow me on...
    •My blog: http://glaforge.appspot.com
    •Twitter: @glaforge
    •Google+: http://gplus.to/glaforge
                                            2
Cédric Champeau
•   Past: Groovy contributor then committer
•   Present: Groovy Core Developer at VMware
    •bug fixes with main focus on static type checking
     and static compilation


•   Follow me on...
    •My blog: http://jroller.com/melix
    •Twitter: @cedricchampeau
    •Google+: http://gplus.to/cchampeau


                                                        3
Agenda (1/2)

• What’s new in Groovy 1.8?
 • Nicer DSLs with command chains
 • Runtime performance improvements
 • GPars bundled for taming your multicores
 • Closure enhancements
 • Builtin JSON support
 • New AST transformations

                                              4
Agenda (2/2)

• What’s cooking for Groovy 2.0?
 • Alignments with JDK 7
  • Project Coin (small language changes)
  • Invoke Dynamic support
   • Continued runtime performance improvements
 • Static type checking
 • Static compilation
 • Modularity
                                                  5
Command chains
•   A grammar improvement allowing you
    to drop dots & parens when chaining method calls
    • an extended version of top-level statements like println


•   Less dots, less parens allow you to
    •write more readable business rules
    •in almost plain English sentences
        •
       (or any language, of course)




                                                                 6
Command chains


	
  turn	
  left	
  	
  then	
  right	
  




                                            7
Command chains
   Alternation of
   method names




	
  turn	
  left	
  	
  then	
  right	
  




                                            7
Command chains
   Alternation of
   method names




	
  turn	
  left	
  	
  then	
  right	
  


                      and parameters
                    (even named ones)




                                            7
Command chains


	
  turn	
  left	
  	
  then	
  right	
  




                                            7
Command chains

    Equivalent to:


	
  turn	
  left	
  	
  then	
  right	
  
	
  	
  	
  	
  	
  (	
  	
  	
  	
  ).	
  	
  	
  	
  (	
  	
  	
  	
  	
  )




                                                                                7
Look  Ma!
N op are ns,
no do ts!
Command chains

take	
  2	
  	
  pills	
  of	
  	
  chloroquinine	
  	
  after	
  	
  6	
  hours




                                                                                   9
Command chains

	
  	
  	
  	
  (	
  ).	
  	
  	
  	
  	
  (	
  	
  ).	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  (	
  	
  	
  	
  	
  ).	
  (	
  	
  	
  	
  	
  )
take	
  2	
  	
  pills	
  of	
  	
  chloroquinine	
  	
  after	
  	
  6	
  hours




                                                                                                                                                                  9
Command chains




                 10
Command chains
//	
  methods	
  with	
  multiple	
  arguments	
  (commas)




                                                             10
Command chains
//	
  methods	
  with	
  multiple	
  arguments	
  (commas)
take	
  coffee	
  	
  with	
  sugar,	
  milk	
  	
  and	
  liquor




                                                                    10
Command chains
//	
  methods	
  with	
  multiple	
  arguments	
  (commas)
take	
  coffee	
  	
  with	
  sugar,	
  milk	
  	
  and	
  liquor

//	
  leverage	
  named-­‐args	
  as	
  punctuation




                                                                    10
Command chains
//	
  methods	
  with	
  multiple	
  arguments	
  (commas)
take	
  coffee	
  	
  with	
  sugar,	
  milk	
  	
  and	
  liquor

//	
  leverage	
  named-­‐args	
  as	
  punctuation
check	
  that:	
  margarita	
  	
  tastes	
  good




                                                                    10
Command chains
//	
  methods	
  with	
  multiple	
  arguments	
  (commas)
take	
  coffee	
  	
  with	
  sugar,	
  milk	
  	
  and	
  liquor

//	
  leverage	
  named-­‐args	
  as	
  punctuation
check	
  that:	
  margarita	
  	
  tastes	
  good

//	
  closure	
  parameters	
  for	
  new	
  control	
  structures




                                                                     10
Command chains
//	
  methods	
  with	
  multiple	
  arguments	
  (commas)
take	
  coffee	
  	
  with	
  sugar,	
  milk	
  	
  and	
  liquor

//	
  leverage	
  named-­‐args	
  as	
  punctuation
check	
  that:	
  margarita	
  	
  tastes	
  good

//	
  closure	
  parameters	
  for	
  new	
  control	
  structures
given	
  {}	
  	
  when	
  {}	
  	
  then	
  {}




                                                                     10
Command chains
//	
  methods	
  with	
  multiple	
  arguments	
  (commas)
take	
  coffee	
  	
  with	
  sugar,	
  milk	
  	
  and	
  liquor

//	
  leverage	
  named-­‐args	
  as	
  punctuation
check	
  that:	
  margarita	
  	
  tastes	
  good

//	
  closure	
  parameters	
  for	
  new	
  control	
  structures
given	
  {}	
  	
  when	
  {}	
  	
  then	
  {}

//	
  zero-­‐arg	
  methods	
  require	
  parens




                                                                     10
Command chains
//	
  methods	
  with	
  multiple	
  arguments	
  (commas)
take	
  coffee	
  	
  with	
  sugar,	
  milk	
  	
  and	
  liquor

//	
  leverage	
  named-­‐args	
  as	
  punctuation
check	
  that:	
  margarita	
  	
  tastes	
  good

//	
  closure	
  parameters	
  for	
  new	
  control	
  structures
given	
  {}	
  	
  when	
  {}	
  	
  then	
  {}

//	
  zero-­‐arg	
  methods	
  require	
  parens
select	
  all	
  	
  unique()	
  from	
  names




                                                                     10
Command chains
//	
  methods	
  with	
  multiple	
  arguments	
  (commas)
take	
  coffee	
  	
  with	
  sugar,	
  milk	
  	
  and	
  liquor

//	
  leverage	
  named-­‐args	
  as	
  punctuation
check	
  that:	
  margarita	
  	
  tastes	
  good

//	
  closure	
  parameters	
  for	
  new	
  control	
  structures
given	
  {}	
  	
  when	
  {}	
  	
  then	
  {}

//	
  zero-­‐arg	
  methods	
  require	
  parens
select	
  all	
  	
  unique()	
  from	
  names

//	
  possible	
  with	
  an	
  odd	
  number	
  of	
  terms



                                                                     10
Command chains
//	
  methods	
  with	
  multiple	
  arguments	
  (commas)
take	
  coffee	
  	
  with	
  sugar,	
  milk	
  	
  and	
  liquor

//	
  leverage	
  named-­‐args	
  as	
  punctuation
check	
  that:	
  margarita	
  	
  tastes	
  good

//	
  closure	
  parameters	
  for	
  new	
  control	
  structures
given	
  {}	
  	
  when	
  {}	
  	
  then	
  {}

//	
  zero-­‐arg	
  methods	
  require	
  parens
select	
  all	
  	
  unique()	
  from	
  names

//	
  possible	
  with	
  an	
  odd	
  number	
  of	
  terms
take	
  3	
  	
  cookies


                                                                     10
Command chains
//	
  methods	
  with	
  multiple	
  arguments	
  (commas)
take	
  coffee	
  	
  with	
  sugar,	
  milk	
  	
  and	
  liquor
	
  	
  	
  	
  (	
  	
  	
  	
  	
  	
  ).	
  	
  	
  	
  (	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ).	
  	
  	
  (	
  	
  	
  	
  	
  	
  )

//	
  leverage	
  named-­‐args	
  as	
  punctuation
check	
  that:	
  margarita	
  	
  tastes	
  good

//	
  closure	
  parameters	
  for	
  new	
  control	
  structures
given	
  {}	
  	
  when	
  {}	
  	
  then	
  {}

//	
  zero-­‐arg	
  methods	
  require	
  parens
select	
  all	
  	
  unique()	
  from	
  names

//	
  possible	
  with	
  an	
  odd	
  number	
  of	
  terms
take	
  3	
  	
  cookies


                                                                                                                                                   10
Command chains
//	
  methods	
  with	
  multiple	
  arguments	
  (commas)
take	
  coffee	
  	
  with	
  sugar,	
  milk	
  	
  and	
  liquor
	
  	
  	
  	
  (	
  	
  	
  	
  	
  	
  ).	
  	
  	
  	
  (	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ).	
  	
  	
  (	
  	
  	
  	
  	
  	
  )

//	
  leverage	
  named-­‐args	
  as	
  punctuation
check	
  that:	
  margarita	
  	
  tastes	
  good
	
  	
  	
  	
  	
  (	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ).	
  	
  	
  	
  	
  	
  (	
  	
  	
  	
  )

//	
  closure	
  parameters	
  for	
  new	
  control	
  structures
given	
  {}	
  	
  when	
  {}	
  	
  then	
  {}

//	
  zero-­‐arg	
  methods	
  require	
  parens
select	
  all	
  	
  unique()	
  from	
  names

//	
  possible	
  with	
  an	
  odd	
  number	
  of	
  terms
take	
  3	
  	
  cookies


                                                                                                                                                   10
Command chains
//	
  methods	
  with	
  multiple	
  arguments	
  (commas)
take	
  coffee	
  	
  with	
  sugar,	
  milk	
  	
  and	
  liquor
	
  	
  	
  	
  (	
  	
  	
  	
  	
  	
  ).	
  	
  	
  	
  (	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ).	
  	
  	
  (	
  	
  	
  	
  	
  	
  )

//	
  leverage	
  named-­‐args	
  as	
  punctuation
check	
  that:	
  margarita	
  	
  tastes	
  good
	
  	
  	
  	
  	
  (	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ).	
  	
  	
  	
  	
  	
  (	
  	
  	
  	
  )

//	
  closure	
  parameters	
  for	
  new	
  control	
  structures
given	
  {}	
  	
  when	
  {}	
  	
  then	
  {}
	
  	
  	
  	
  	
  (	
  	
  ).	
  	
  	
  	
  (	
  	
  ).	
  	
  	
  	
  (	
  	
  )

//	
  zero-­‐arg	
  methods	
  require	
  parens
select	
  all	
  	
  unique()	
  from	
  names

//	
  possible	
  with	
  an	
  odd	
  number	
  of	
  terms
take	
  3	
  	
  cookies


                                                                                                                                                   10
Command chains
//	
  methods	
  with	
  multiple	
  arguments	
  (commas)
take	
  coffee	
  	
  with	
  sugar,	
  milk	
  	
  and	
  liquor
	
  	
  	
  	
  (	
  	
  	
  	
  	
  	
  ).	
  	
  	
  	
  (	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ).	
  	
  	
  (	
  	
  	
  	
  	
  	
  )

//	
  leverage	
  named-­‐args	
  as	
  punctuation
check	
  that:	
  margarita	
  	
  tastes	
  good
	
  	
  	
  	
  	
  (	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ).	
  	
  	
  	
  	
  	
  (	
  	
  	
  	
  )

//	
  closure	
  parameters	
  for	
  new	
  control	
  structures
given	
  {}	
  	
  when	
  {}	
  	
  then	
  {}
	
  	
  	
  	
  	
  (	
  	
  ).	
  	
  	
  	
  (	
  	
  ).	
  	
  	
  	
  (	
  	
  )

//	
  zero-­‐arg	
  methods	
  require	
  parens
select	
  all	
  	
  unique()	
  from	
  names
	
  	
  	
  	
  	
  	
  (	
  	
  	
  ).	
  	
  	
  	
  	
  	
  	
  	
  .	
  	
  	
  	
  (	
  	
  	
  	
  	
  )

//	
  possible	
  with	
  an	
  odd	
  number	
  of	
  terms
take	
  3	
  	
  cookies


                                                                                                                                                   10
Command chains
//	
  methods	
  with	
  multiple	
  arguments	
  (commas)
take	
  coffee	
  	
  with	
  sugar,	
  milk	
  	
  and	
  liquor
	
  	
  	
  	
  (	
  	
  	
  	
  	
  	
  ).	
  	
  	
  	
  (	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ).	
  	
  	
  (	
  	
  	
  	
  	
  	
  )

//	
  leverage	
  named-­‐args	
  as	
  punctuation
check	
  that:	
  margarita	
  	
  tastes	
  good
	
  	
  	
  	
  	
  (	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ).	
  	
  	
  	
  	
  	
  (	
  	
  	
  	
  )

//	
  closure	
  parameters	
  for	
  new	
  control	
  structures
given	
  {}	
  	
  when	
  {}	
  	
  then	
  {}
	
  	
  	
  	
  	
  (	
  	
  ).	
  	
  	
  	
  (	
  	
  ).	
  	
  	
  	
  (	
  	
  )

//	
  zero-­‐arg	
  methods	
  require	
  parens
select	
  all	
  	
  unique()	
  from	
  names
	
  	
  	
  	
  	
  	
  (	
  	
  	
  ).	
  	
  	
  	
  	
  	
  	
  	
  .	
  	
  	
  	
  (	
  	
  	
  	
  	
  )

//	
  possible	
  with	
  an	
  odd	
  number	
  of	
  terms
take	
  3	
  	
  cookies
	
  	
  	
  	
  (	
  ).


                                                                                                                                                   10
GPars bundled

•   GPars is bundled in the Groovy distribution


•   GPars covers a wide range of parallel and concurrent paradigms
    •actors, fork/join, map/filter/reduce, dataflow, agents
    •parallel arrays, executors, STM, and more...


•   And you can use it from plain Java as well!



                                                                     11
Closure enhancements
• Closure annotation parameters
•   Some more functional flavor
    •composition: compose several closures into one single closure
    •trampoline: avoid stack overflow errors for recursive algorithms
    •memoization: remember the outcome of previous closure
     invocations
    •currying improvements




                                                                       12
Closure annotation parameters
    @Retention(RetentionPolicy.RUNTIME)
    @interface	
  Invariant	
  {	
  	
  	
  	
  
    	
  	
  	
  	
  Class	
  value()	
  //	
  a	
  closure	
  class
    }
    	
  

{   @Invariant({	
  number	
  >=	
  0	
  })
    class	
  Distance	
  {	
  	
  	
  	
  
    	
  	
  	
  	
  float	
  number	
  	
  	
  	
  
    	
  	
  	
  	
  String	
  unit
    }	
  
    	
  
    def	
  d	
  =	
  new	
  Distance(number:	
  10,	
  unit:	
  "meters")	
  
    def	
  anno	
  =	
  Distance.getAnnotation(Invariant)
    def	
  check	
  =	
  anno.value().newInstance(d,	
  d)
    assert	
  check(d)



                                                                                13
Closure annotation parameters
    @Retention(RetentionPolicy.RUNTIME)
    @interface	
  Invariant	
  {	
  	
  	
  	
  
    	
  	
  	
  	
  Class	
  value()	
  //	
  a	
  closure	
  class
    }
    	
  

{   @Invariant({	
  number	
  >=	
  0	
  })
    class	
  Distance	
  {	
  	
  	
  	
  
    	
  	
  	
  	
  float	
  number	
  	
  	
  	
  
                                                     Poor -man   ’s GCo
                                                                       n tracts
    	
  	
  	
  	
  String	
  unit
    }	
  
    	
  
    def	
  d	
  =	
  new	
  Distance(number:	
  10,	
  unit:	
  "meters")	
  
    def	
  anno	
  =	
  Distance.getAnnotation(Invariant)
    def	
  check	
  =	
  anno.value().newInstance(d,	
  d)
    assert	
  check(d)



                                                                                  13
Closure memoization




                      14
Closure memoization
def	
  plus	
  =	
  {	
  a,	
  b	
  -­‐>	
  sleep	
  1000;	
  a	
  +	
  b	
  }.memoize()




                                                                                           14
Closure memoization
def	
  plus	
  =	
  {	
  a,	
  b	
  -­‐>	
  sleep	
  1000;	
  a	
  +	
  b	
  }.memoize()

assert	
  plus(1,	
  2)	
  ==	
  3	
  //	
  after	
  1000ms




                                                                                           14
Closure memoization
def	
  plus	
  =	
  {	
  a,	
  b	
  -­‐>	
  sleep	
  1000;	
  a	
  +	
  b	
  }.memoize()

assert	
  plus(1,	
  2)	
  ==	
  3	
  //	
  after	
  1000ms
assert	
  plus(1,	
  2)	
  ==	
  3	
  //	
  return	
  immediately




                                                                                           14
Closure memoization
def	
  plus	
  =	
  {	
  a,	
  b	
  -­‐>	
  sleep	
  1000;	
  a	
  +	
  b	
  }.memoize()

assert	
  plus(1,	
  2)	
  ==	
  3	
  //	
  after	
  1000ms
assert	
  plus(1,	
  2)	
  ==	
  3	
  //	
  return	
  immediately
assert	
  plus(2,	
  2)	
  ==	
  4	
  //	
  after	
  1000ms




                                                                                           14
Closure memoization
def	
  plus	
  =	
  {	
  a,	
  b	
  -­‐>	
  sleep	
  1000;	
  a	
  +	
  b	
  }.memoize()

assert	
  plus(1,	
  2)	
  ==	
  3	
  //	
  after	
  1000ms
assert	
  plus(1,	
  2)	
  ==	
  3	
  //	
  return	
  immediately
assert	
  plus(2,	
  2)	
  ==	
  4	
  //	
  after	
  1000ms
assert	
  plus(2,	
  2)	
  ==	
  4	
  //	
  return	
  immediately	
  	
  




                                                                                           14
Closure memoization
def	
  plus	
  =	
  {	
  a,	
  b	
  -­‐>	
  sleep	
  1000;	
  a	
  +	
  b	
  }.memoize()

assert	
  plus(1,	
  2)	
  ==	
  3	
  //	
  after	
  1000ms
assert	
  plus(1,	
  2)	
  ==	
  3	
  //	
  return	
  immediately
assert	
  plus(2,	
  2)	
  ==	
  4	
  //	
  after	
  1000ms
assert	
  plus(2,	
  2)	
  ==	
  4	
  //	
  return	
  immediately	
  	
  
	
  




                                                                                           14
Closure memoization
def	
  plus	
  =	
  {	
  a,	
  b	
  -­‐>	
  sleep	
  1000;	
  a	
  +	
  b	
  }.memoize()

assert	
  plus(1,	
  2)	
  ==	
  3	
  //	
  after	
  1000ms
assert	
  plus(1,	
  2)	
  ==	
  3	
  //	
  return	
  immediately
assert	
  plus(2,	
  2)	
  ==	
  4	
  //	
  after	
  1000ms
assert	
  plus(2,	
  2)	
  ==	
  4	
  //	
  return	
  immediately	
  	
  
	
  
//	
  at	
  least	
  10	
  invocations	
  cached




                                                                                           14
Closure memoization
def	
  plus	
  =	
  {	
  a,	
  b	
  -­‐>	
  sleep	
  1000;	
  a	
  +	
  b	
  }.memoize()

assert	
  plus(1,	
  2)	
  ==	
  3	
  //	
  after	
  1000ms
assert	
  plus(1,	
  2)	
  ==	
  3	
  //	
  return	
  immediately
assert	
  plus(2,	
  2)	
  ==	
  4	
  //	
  after	
  1000ms
assert	
  plus(2,	
  2)	
  ==	
  4	
  //	
  return	
  immediately	
  	
  
	
  
//	
  at	
  least	
  10	
  invocations	
  cached
def	
  plusAtLeast	
  =	
  {	
  ...	
  }.memoizeAtLeast(10)




                                                                                           14
Closure memoization
def	
  plus	
  =	
  {	
  a,	
  b	
  -­‐>	
  sleep	
  1000;	
  a	
  +	
  b	
  }.memoize()

assert	
  plus(1,	
  2)	
  ==	
  3	
  //	
  after	
  1000ms
assert	
  plus(1,	
  2)	
  ==	
  3	
  //	
  return	
  immediately
assert	
  plus(2,	
  2)	
  ==	
  4	
  //	
  after	
  1000ms
assert	
  plus(2,	
  2)	
  ==	
  4	
  //	
  return	
  immediately	
  	
  
	
  
//	
  at	
  least	
  10	
  invocations	
  cached
def	
  plusAtLeast	
  =	
  {	
  ...	
  }.memoizeAtLeast(10)
	
  




                                                                                           14
Closure memoization
def	
  plus	
  =	
  {	
  a,	
  b	
  -­‐>	
  sleep	
  1000;	
  a	
  +	
  b	
  }.memoize()

assert	
  plus(1,	
  2)	
  ==	
  3	
  //	
  after	
  1000ms
assert	
  plus(1,	
  2)	
  ==	
  3	
  //	
  return	
  immediately
assert	
  plus(2,	
  2)	
  ==	
  4	
  //	
  after	
  1000ms
assert	
  plus(2,	
  2)	
  ==	
  4	
  //	
  return	
  immediately	
  	
  
	
  
//	
  at	
  least	
  10	
  invocations	
  cached
def	
  plusAtLeast	
  =	
  {	
  ...	
  }.memoizeAtLeast(10)
	
  
//	
  at	
  most	
  10	
  invocations	
  cached




                                                                                           14
Closure memoization
def	
  plus	
  =	
  {	
  a,	
  b	
  -­‐>	
  sleep	
  1000;	
  a	
  +	
  b	
  }.memoize()

assert	
  plus(1,	
  2)	
  ==	
  3	
  //	
  after	
  1000ms
assert	
  plus(1,	
  2)	
  ==	
  3	
  //	
  return	
  immediately
assert	
  plus(2,	
  2)	
  ==	
  4	
  //	
  after	
  1000ms
assert	
  plus(2,	
  2)	
  ==	
  4	
  //	
  return	
  immediately	
  	
  
	
  
//	
  at	
  least	
  10	
  invocations	
  cached
def	
  plusAtLeast	
  =	
  {	
  ...	
  }.memoizeAtLeast(10)
	
  
//	
  at	
  most	
  10	
  invocations	
  cached
def	
  plusAtMost	
  =	
  {	
  ...	
  }.memoizeAtMost(10)	
  




                                                                                           14
Closure memoization
def	
  plus	
  =	
  {	
  a,	
  b	
  -­‐>	
  sleep	
  1000;	
  a	
  +	
  b	
  }.memoize()

assert	
  plus(1,	
  2)	
  ==	
  3	
  //	
  after	
  1000ms
assert	
  plus(1,	
  2)	
  ==	
  3	
  //	
  return	
  immediately
assert	
  plus(2,	
  2)	
  ==	
  4	
  //	
  after	
  1000ms
assert	
  plus(2,	
  2)	
  ==	
  4	
  //	
  return	
  immediately	
  	
  
	
  
//	
  at	
  least	
  10	
  invocations	
  cached
def	
  plusAtLeast	
  =	
  {	
  ...	
  }.memoizeAtLeast(10)
	
  
//	
  at	
  most	
  10	
  invocations	
  cached
def	
  plusAtMost	
  =	
  {	
  ...	
  }.memoizeAtMost(10)	
  

//	
  between	
  10	
  and	
  20	
  invocations	
  cached




                                                                                           14
Closure memoization
def	
  plus	
  =	
  {	
  a,	
  b	
  -­‐>	
  sleep	
  1000;	
  a	
  +	
  b	
  }.memoize()

assert	
  plus(1,	
  2)	
  ==	
  3	
  //	
  after	
  1000ms
assert	
  plus(1,	
  2)	
  ==	
  3	
  //	
  return	
  immediately
assert	
  plus(2,	
  2)	
  ==	
  4	
  //	
  after	
  1000ms
assert	
  plus(2,	
  2)	
  ==	
  4	
  //	
  return	
  immediately	
  	
  
	
  
//	
  at	
  least	
  10	
  invocations	
  cached
def	
  plusAtLeast	
  =	
  {	
  ...	
  }.memoizeAtLeast(10)
	
  
//	
  at	
  most	
  10	
  invocations	
  cached
def	
  plusAtMost	
  =	
  {	
  ...	
  }.memoizeAtMost(10)	
  

//	
  between	
  10	
  and	
  20	
  invocations	
  cached
def	
  plusAtLeast	
  =	
  {	
  ...	
  }.memoizeBetween(10,	
  20)



                                                                                           14
Builtin JSON support

•   Consuming


•   Producing


•   Pretty-printing




                                       15
Builtin JSON support
import	
  groovy.json.*	
  

def	
  payload	
  =	
  new	
  URL(
	
  	
  	
  	
  "http://github.../json/commits/...").text	
  

def	
  slurper	
  =	
  new	
  JsonSlurper()
def	
  doc	
  =	
  slurper.parseText(payload)	
  

doc.commits.message.each	
  {	
  println	
  it	
  }




                                                                16
Builtin JSON support
import	
  groovy.json.*	
  
	
  
def	
  json	
  =	
  new	
  JsonBuilder()	
  
	
  
json.person	
  {	
  	
  	
  	
  
	
  	
  	
  	
  name	
  "Guillaume"
	
  	
  	
  	
  age	
  34	
  	
  	
  	
  
	
  	
  	
  	
  pets	
  "Hector",	
  "Felix"
}	
  
println	
  json.toString()




                                               17
Builtin JSON support
import	
  groovy.json.*	
  
	
  
def	
  json	
  =	
  new	
  JsonBuilder()	
  
	
  
                                               {	
  	
  	
  	
  
json.person	
  {	
  	
  	
  	
                 	
  	
  	
  	
  "person":	
  {	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  name	
  "Guillaume"            	
  	
  	
  	
  	
  	
  	
  	
  "name":	
  "Guillaume",	
  	
  	
  	
  	
                            	
  
	
  	
  	
  	
  age	
  34	
  	
  	
  	
        	
  	
  	
  	
  	
  	
  	
  	
  "age":	
  34,	
  	
  	
  	
  	
  	
  	
  	
  
                                               	
  	
  	
  	
  	
  	
  	
  	
  "pets":	
  [	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  pets	
  "Hector",	
  "Felix"   	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "Hector",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
}	
                                            	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "Felix"	
  	
  	
  	
  	
  	
  	
  	
  
                                               	
  	
  	
  	
  	
  	
  	
  	
  ]	
  	
  	
  	
  
println	
  json.toString()                     	
  	
  	
  	
  }
                                               }




                                                                                                                                                           17
Builtin JSON support
import	
  groovy.json.*	
  
	
  
println	
  JsonOutput.prettyPrint(
	
  	
  	
  	
  '''{"person":{"name":"Guillaume","age":34,'''	
  +	
  
	
  	
  	
  	
  '''"pets":["Hector","Felix"]}}''')
	
  



                    {	
  	
  	
  	
  
                    	
  	
  	
  	
  "person":	
  {	
  	
  	
  	
  	
  	
  	
  	
  
                    	
  	
  	
  	
  	
  	
  	
  	
  "name":	
  "Guillaume",	
  	
  	
                               	
  
                    	
  	
  	
  	
  	
  	
  	
  	
  "age":	
  34,	
  	
  	
  	
  	
  	
  	
  	
  
                    	
  	
  	
  	
  	
  	
  	
  	
  "pets":	
  [	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
                    	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "Hector",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
                                                                                                                    	
  
                    	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "Felix"	
  	
  	
  	
  	
  	
  	
  	
  
                    	
  	
  	
  	
  	
  	
  	
  	
  ]	
  	
  	
  	
  
                    	
  	
  	
  	
  }
                    }




                                                                                                                           18
New AST transformations
• @Log                       • Controlling execution
                                 •   @ThreadInterrupt

•   @Field                       •   @TimedInterrupt
                                 •   @ConditionalInterrupt

•   @AutoClone
                             • @InheritConstructor
•   @AutoExternalizable


•   @Canonical
                             •   @WithReadLock

    •   @ToString            •   @WithWriteLock

    •   @EqualsAndHashCode
    •   @TupleConstructor    •   @ListenerList

                                                             19
@Log
•   Four different loggers can be injected
    •@Log                                    import	
  groovy.util.logging.*	
  

    •
                                             	
  
     @Commons                                @Log
    •@Log4j                                  class	
  Car	
  {	
  	
  	
  	
  
                                             	
  	
  	
  	
  Car()	
  {	
  	
  	
  	
  	
  	
  	
  	
  
    •@Slf4j                                  	
  	
  	
  	
  	
  	
  	
  	
  log.info	
  'Car	
  constructed'	
  	
  	
  
                                             	
  	
  	
  	
  }
                                                                                                                      	
  

                                             }	
  
•   Possible to implement                    	
  
                                             def	
  c	
  =	
  new	
  Car()
    your own strategy




                                                                                                                             20
@Log
•   Four different loggers can be injected
    •@Log                                    import	
  groovy.util.logging.*	
  

    •
                                             	
  
     @Commons                                @Log
    •@Log4j                                  class	
  Car	
  {	
  	
  	
  	
  
                                             	
  	
  	
  	
  Car()	
  {	
  	
  	
  	
  	
  	
  	
  	
  
    •@Slf4j                      Guarded
                                 w/ an if
                                             	
  	
  	
  	
  	
  	
  	
  	
  log.info	
  'Car	
  constructed'	
  	
  	
  
                                             	
  	
  	
  	
  }
                                                                                                                      	
  

                                             }	
  
•   Possible to implement                    	
  
                                             def	
  c	
  =	
  new	
  Car()
    your own strategy




                                                                                                                             20
Controlling code execution




                             21
Controlling code execution
•   Your application may run user’s code
    •what if the code runs in infinite loops or for too long?
    •what if the code consumes too many resources?




                                                               21
Controlling code execution
•   Your application may run user’s code
    •what if the code runs in infinite loops or for too long?
    •what if the code consumes too many resources?




                                                               21
Controlling code execution
•   Your application may run user’s code
    •what if the code runs in infinite loops or for too long?
    •what if the code consumes too many resources?


•   3 new transforms at your rescue
    • @ThreadInterrupt: adds Thread#isInterrupted checks so your
      executing thread stops when interrupted
    • @TimedInterrupt: adds checks in method and closure bodies to
      verify it’s run longer than expected
    • @ConditionalInterrupt: adds checks with your own conditional
      logic to break out from the user code
                                                                     21
@ThreadInterrupt

@ThreadInterrupt
import	
  groovy.transform.ThreadInterrupt	
  
	
  
while	
  (true)	
  {


	
  	
  	
  	
  //	
  eat	
  lots	
  of	
  CPU
}




                                                 22


                                                      33
@ThreadInterrupt

    @ThreadInterrupt
    import	
  groovy.transform.ThreadInterrupt	
  
    	
  
    while	
  (true)	
  {

{   	
  	
  	
  	
  if	
  (Thread.currentThread.isInterrupted())
    	
  	
  	
  	
  	
  	
  	
  	
  throw	
  new	
  InterruptedException()   }
    	
  	
  	
  	
  //	
  eat	
  lots	
  of	
  CPU
    }




                                                                                 22


                                                                                      33
@ToString
•       Provides a default toString() method to your types
•       Available annotation options
    •    includeNames, includeFields, includeSuper, excludes

                               import	
  groovy.transform.ToString	
  
                               	
  
                               @ToString
                               class	
  Person	
  {	
  	
  	
  	
  
                               	
  	
  	
  	
  String	
  name	
  	
  	
  	
  
                               	
  	
  	
  	
  int	
  age
                               }	
  
                               	
  
                               println	
  new	
  Person(name:	
  'Pete',	
  age:	
  15)
                               //	
  =>	
  Person(Pete,	
  15)




                                                                                          23
@EqualsAndHashCode
•   Provides default implementations for equals() and hashCode() methods

                        import	
  groovy.transform.EqualsAndHashCode	
  
                        	
  
                        @EqualsAndHashCode
                        class	
  Coord	
  {	
  	
  	
  	
  
                        	
  	
  	
  	
  int	
  x,	
  y
                        }	
  
                        	
  
                        def	
  c1	
  =	
  new	
  Coord(x:	
  20,	
  y:	
  5)
                        def	
  c2	
  =	
  new	
  Coord(x:	
  20,	
  y:	
  5)	
  
                        	
  
                        assert	
  c1	
  ==	
  c2
                        assert	
  c1.hashCode()	
  ==	
  c2.hashCode()




                                                                                   24
@TupleConstructor
•   Provides a «classical» constructor with all properties
•   Several annotation parameter options available

                        import	
  groovy.transform.TupleConstructor	
  
                        	
  
                        @TupleConstructor	
  
                        class	
  Person	
  {	
  	
  	
  	
  
                        	
  	
  	
  	
  String	
  name	
  	
  	
  	
  
                        	
  	
  	
  	
  int	
  age
                        }	
  
                        	
  
                        def	
  m	
  =	
  new	
  Person('Marion',	
  4)	
  	
  	
  	
  	
  	
  
                        	
  
                        assert	
  m.name	
  ==	
  'Marion'
                        assert	
  m.age	
  	
  ==	
  4



                                                                                                 25
@InheritConstructors
•   Classes like Exception are painful when extended,
    as all the base constructors should be replicated




             class	
  CustomException	
  extends	
  Exception	
  {
             	
  	
  	
  	
  CustomException()	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  {	
  super()	
  	
  	
  	
  	
  	
  	
  }
             	
  	
  	
  	
  CustomException(String	
  msg)	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  {	
  super(msg)	
  	
  	
  	
  }
             	
  	
  	
  	
  CustomException(String	
  msg,	
  Throwable	
  t)	
  {	
  super(msg,	
  t)	
  }
             	
  	
  	
  	
  CustomException(Throwable	
  t)	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  {	
  super(t)	
  	
  	
  	
  	
  	
  }
             }




                                                                                                                                                                                          26
@InheritConstructors
•   Classes like Exception are painful when extended,
    as all the base constructors should be replicated

             import	
  groovy.transform.*

             @InheritConstructors
             class	
  CustomException	
  extends	
  Exception	
  {
             	
  	
  	
  	
  CustomException()	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  {	
  super()	
  	
  	
  	
  	
  	
  	
  }
             	
  	
  	
  	
  CustomException(String	
  msg)	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  {	
  super(msg)	
  	
  	
  	
  }
             	
  	
  	
  	
  CustomException(String	
  msg,	
  Throwable	
  t)	
  {	
  super(msg,	
  t)	
  }
             	
  	
  	
  	
  CustomException(Throwable	
  t)	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  {	
  super(t)	
  	
  	
  	
  	
  	
  }
             }




                                                                                                                                                                                          26
Miscelanous
•   Compilation customizers
•   Java 7 diamond operator
•   Slashy and dollar slashy strings
•   New GDK methods
•   (G)String to Enum coercion
•   Customizing the Groovysh prompt
•   Executing remote scripts




                                       27
Compilation customizers
•   Ability to apply some customization to the Groovy compilation process


•   Three available customizers
    •ImportCustomizer
    •ASTTransformationCustomizer
    •SecureASTCustomizer


•   But you can implement your own



                                                                            28
Imports customizer
def	
  configuration	
  =	
  new	
  CompilerConfiguration()
	
  
def	
  custo	
  =	
  new	
  ImportCustomizer()
custo.addStaticStar(Math.name)
configuration.addCompilationCustomizers(custo)	
  
	
  
def	
  result	
  =	
  new	
  GroovyShell(configuration)
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //	
  import	
  static	
  java.lang.Math.*
	
  	
  	
  	
  .evaluate("	
  cos	
  PI/3	
  ")
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  




                                                                                                 29
What’s
cooking
for 2.0?
Groovy 2.0 roadmap
•   Towards a more modular Groovy
•   Java 7 alignements: Project Coin
    • binary literals
    • underscore in literals
    • multicatch
•   JDK 7: InvokeDynamic
•   Static type checking
•   Static compilation



                                       31
Groovy Modularity
•   Groovy’s «all» JAR weighs in at 4MB


• Nobody needs everything
 • Template engine, Ant scripting, Swing UI building...
•   Provide a smaller core
    •and several smaller JARs per feature
•   Provide hooks for setting up DGM methods, etc.



                                                          32
Java 7 / JDK 7

•   Project Coin and InvokeDynamic




                                     33
Binary literals
•   We had decimal, octal and hexadecimal notations for number literals
•   We can now use binary representations too

                          int	
  x	
  =	
  0b10101111
                          assert	
  x	
  ==	
  175
                          	
  
                          byte	
  aByte	
  =	
  0b00100001
                          assert	
  aByte	
  ==	
  33
                          	
  
                          int	
  anInt	
  =	
  0b1010000101000101
                          assert	
  anInt	
  ==	
  41285




                                                                          34
Underscore in literals
•   Now we can also add underscores
    in number literals for more readability

                long	
  creditCardNumber	
  =	
  1234_5678_9012_3456L
                long	
  socialSecurityNumbers	
  =	
  999_99_9999L
                float	
  monetaryAmount	
  =	
  12_345_132.12
                long	
  hexBytes	
  =	
  0xFF_EC_DE_5E
                long	
  hexWords	
  =	
  0xFFEC_DE5E
                long	
  maxLong	
  =	
  0x7fff_ffff_ffff_ffffL
                long	
  alsoMaxLong	
  =	
  9_223_372_036_854_775_807L
                long	
  bytes	
  =	
  0b11010010_01101001_10010100_10010010




                                                                              35
Multicatch
•   One block for multiple exception caught
    •rather than duplicating the block


               try	
  {
               	
  	
  	
  	
  /*	
  ...	
  */
               }	
  catch(IOException	
  |	
  NullPointerException	
  e)	
  {
               	
  	
  	
  	
  /*	
  one	
  block	
  to	
  treat	
  2	
  exceptions	
  */
               }




                                                                                            36
Your
turn!



        37
InvokeDynamic
• Groovy 2.0 supports JDK 7’s invokeDynamic
 • compiler has a flag for compiling against JDK 7
 • might use the invokeDynamic backport for < JDK 7
•   Benefits
    • more runtime performance!
        •
       at least as fast as current «dynamic» Groovy
    •in the long run, will allow us to get rid of code!
        •
       call site caching, thanks to MethodHandles
        •
       metaclass registry, thanks to ClassValues
        •
       will let the JIT inline calls more easily
                                                          38
Static Type Checking
•       Goal: make the Groovy compiler «grumpy»!
    •    and throw compilation errors (not at runtime)
• Not everybody needs dynamic features all the time
    •    think Java libraries scripting
•       Grumpy should...
    •    tell you about your method or variable typos
    •    complain if you call methods that don’t exist
    •    shout on assignments of wrong types
    •    infer the types of your variables
    •    figure out GDK methods
    •    etc...
                                                         39
Typos in your variable or method
import	
  groovy.transform.TypeChecked
	
  
void	
  method()	
  {}
	
  
@TypeChecked	
  test()	
  {
	
  	
  	
  	
  //	
  Cannot	
  find	
  matching	
  method	
  metthhoood()
	
  	
  	
  	
  metthhoood()
	
  
	
  	
  	
  	
  def	
  name	
  =	
  "Guillaume"
	
  	
  	
  	
  //	
  variable	
  naamme	
  is	
  undeclared
	
  	
  	
  	
  println	
  naamme
}




                                                                             40
Typos in your variable or method
import	
  groovy.transform.TypeChecked
	
  
void	
  method()	
  {}
	
  
@TypeChecked	
  test()	
  {
	
  	
  	
  	
  //	
  Cannot	
  find	
  matching	
  method	
  metthhoood()
	
  	
  	
  	
  metthhoood()
	
  
	
  	
  	
  	
  def	
  name	
  =	
  "Guillaume"                              Compilation
	
  	
  	
  	
  //	
  variable	
  naamme	
  is	
  undeclared                   errors!
	
  	
  	
  	
  println	
  naamme
}




                                                                                           40
Typos in your variable or method
                                                                             Annotation can be at
import	
  groovy.transform.TypeChecked                                       class or method level
	
  
void	
  method()	
  {}
	
  
@TypeChecked	
  test()	
  {
	
  	
  	
  	
  //	
  Cannot	
  find	
  matching	
  method	
  metthhoood()
	
  	
  	
  	
  metthhoood()
	
  
	
  	
  	
  	
  def	
  name	
  =	
  "Guillaume"                              Compilation
	
  	
  	
  	
  //	
  variable	
  naamme	
  is	
  undeclared                   errors!
	
  	
  	
  	
  println	
  naamme
}




                                                                                                     40
Complain on wrong assignments
   //	
  cannot	
  assign	
  value	
  of	
  type...	
  to	
  variable...
   int	
  x	
  =	
  new	
  Object()
   Set	
  set	
  =	
  new	
  Object()
   	
  
   def	
  o	
  =	
  new	
  Object()
   int	
  x	
  =	
  o
   	
  
   String[]	
  strings	
  =	
  ['a','b','c']
   int	
  str	
  =	
  strings[0]
   	
  
   //	
  cannot	
  find	
  matching	
  method	
  plus()
   int	
  i	
  =	
  0
   i	
  +=	
  '1'




                                                                           41
Complain on wrong assignments
   //	
  cannot	
  assign	
  value	
  of	
  type...	
  to	
  variable...
   int	
  x	
  =	
  new	
  Object()
   Set	
  set	
  =	
  new	
  Object()                                      Compilation
   	
                                                                        errors!
   def	
  o	
  =	
  new	
  Object()
   int	
  x	
  =	
  o
   	
  
   String[]	
  strings	
  =	
  ['a','b','c']
   int	
  str	
  =	
  strings[0]
   	
  
   //	
  cannot	
  find	
  matching	
  method	
  plus()
   int	
  i	
  =	
  0
   i	
  +=	
  '1'




                                                                                         41
Complain on wrong return types
   //	
  checks	
  if/else	
  branch	
  return	
  values
   @TypeChecked
   int	
  method()	
  {
   	
  	
  	
  	
  if	
  (true)	
  {	
  'String'	
  }
   	
  	
  	
  	
  else	
  {	
  42	
  }
   }
   //	
  works	
  for	
  switch/case	
  &	
  try/catch/finally
   	
  
   //	
  transparent	
  toString()	
  implied
   @TypeChecked
   String	
  greeting(String	
  name)	
  {
   	
  	
  	
  	
  def	
  sb	
  =	
  new	
  StringBuilder()
   	
  	
  	
  	
  sb	
  <<	
  "Hi	
  "	
  <<	
  name
   }




                                                                 42
Complain on wrong return types
   //	
  checks	
  if/else	
  branch	
  return	
  values
   @TypeChecked
   int	
  method()	
  {                                          Compilation
   	
  	
  	
  	
  if	
  (true)	
  {	
  'String'	
  }               error!
   	
  	
  	
  	
  else	
  {	
  42	
  }
   }
   //	
  works	
  for	
  switch/case	
  &	
  try/catch/finally
   	
  
   //	
  transparent	
  toString()	
  implied
   @TypeChecked
   String	
  greeting(String	
  name)	
  {
   	
  	
  	
  	
  def	
  sb	
  =	
  new	
  StringBuilder()
   	
  	
  	
  	
  sb	
  <<	
  "Hi	
  "	
  <<	
  name
   }




                                                                               42
Type inference
@TypeChecked	
  test()	
  {
	
  	
  	
  	
  def	
  name	
  =	
  "	
  	
  Guillaume	
  	
  "
	
  
	
  	
  	
  	
  //	
  String	
  type	
  infered	
  (even	
  inside	
  GString)
	
  	
  	
  	
  println	
  "NAME	
  =	
  ${name.toUpperCase()}"	
  
	
  
	
  	
  	
  	
  //	
  Groovy	
  GDK	
  method	
  support
	
  	
  	
  	
  //	
  (GDK	
  operator	
  overloading	
  too)
	
  	
  	
  	
  println	
  name.trim()
	
  
	
  	
  	
  	
  int[]	
  numbers	
  =	
  [1,	
  2,	
  3]
	
  	
  	
  	
  //	
  Element	
  n	
  is	
  an	
  int
	
  	
  	
  	
  for	
  (int	
  n	
  in	
  numbers)	
  {
	
  	
  	
  	
  	
  	
  	
  	
  println	
  n
	
  	
  	
  	
  }
}




                                                                                 43
Statically checked & dyn. methods
        @TypeChecked
        String	
  greeting(String	
  name)	
  {
        	
  	
  	
  	
  //	
  call	
  method	
  with	
  dynamic	
  behavior
        	
  	
  	
  	
  //	
  but	
  with	
  proper	
  signature
        	
  	
  	
  	
  generateMarkup(name.toUpperCase())
        }
        	
  
        //	
  usual	
  dynamic	
  behavior
        String	
  generateMarkup(String	
  name)	
  {
        	
  	
  	
  	
  def	
  sw	
  =	
  new	
  StringWriter()
        	
  	
  	
  	
  new	
  MarkupBuilder(sw).html	
  {
        	
  	
  	
  	
  	
  	
  	
  	
  body	
  {
        	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  div	
  name
        	
  	
  	
  	
  	
  	
  	
  	
  }
        	
  	
  	
  	
  }
        	
  	
  	
  	
  sw.toString()
        }




                                                                              44
Instanceof checks
@TypeChecked	
  
void	
  test(Object	
  val)	
  {

	
  	
  	
  	
  if	
  (val	
  instanceof	
  String)	
  {
	
  	
  	
  	
  	
  	
  	
  	
  println	
  val.toUpperCase()
	
  	
  	
  	
  }	
  else	
  if	
  (val	
  instanceof	
  Number)	
  {
	
  	
  	
  	
  	
  	
  	
  	
  println	
  "X"	
  *	
  val.intValue()
	
  	
  	
  	
  }

}




                                                                        45
Instanceof checks
                                                                        No need
@TypeChecked	
  
                                                                        for casts
void	
  test(Object	
  val)	
  {

	
  	
  	
  	
  if	
  (val	
  instanceof	
  String)	
  {
	
  	
  	
  	
  	
  	
  	
  	
  println	
  val.toUpperCase()
	
  	
  	
  	
  }	
  else	
  if	
  (val	
  instanceof	
  Number)	
  {
	
  	
  	
  	
  	
  	
  	
  	
  println	
  "X"	
  *	
  val.intValue()
	
  	
  	
  	
  }

}




                                                                                    45
Instanceof checks
                                                                                      No need
              @TypeChecked	
  
                                                                                      for casts
              void	
  test(Object	
  val)	
  {

              	
  	
  	
  	
  if	
  (val	
  instanceof	
  String)	
  {
              	
  	
  	
  	
  	
  	
  	
  	
  println	
  val.toUpperCase()
              	
  	
  	
  	
  }	
  else	
  if	
  (val	
  instanceof	
  Number)	
  {
              	
  	
  	
  	
  	
  	
  	
  	
  println	
  "X"	
  *	
  val.intValue()
              	
  	
  	
  	
  }

              }


 Can call String#multiply(int)
from the Groovy Development Kit

                                                                                                  45
Lowest Upper Bound
•   Represents the lowest «super» type classes have in common
    •may be virtual (aka «non-denotable»)

                @TypeChecked	
  test()	
  {
                	
  	
  	
  	
  //	
  an	
  integer	
  and	
  a	
  BigDecimal
                	
  	
  	
  	
  return	
  [1234,	
  3.14]
                }




                                                                                46
Lowest Upper Bound
•   Represents the lowest «super» type classes have in common
    •may be virtual (aka «non-denotable»)

                @TypeChecked	
  test()	
  {
                	
  	
  	
  	
  //	
  an	
  integer	
  and	
  a	
  BigDecimal
                	
  	
  	
  	
  return	
  [1234,	
  3.14]
                }



                  Inferred return type:
                    List<Number>


                                                                                46
Flow typing
•   Static type checking shouldn’t complain
    even for bad coding practicies which work without type checks

           @TypeChecked	
  test()	
  {
           	
  	
  	
  	
  def	
  var	
  =	
  123	
  	
  	
  	
  	
  	
  	
  	
  	
  //	
  inferred	
  type	
  is	
  int
           	
  	
  	
  	
  int	
  x	
  =	
  var	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //	
  var	
  is	
  an	
  int
           	
  	
  	
  	
  var	
  =	
  "123"	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //	
  assign	
  var	
  with	
  a	
  String

           	
  	
  	
  	
  x	
  =	
  var.toInteger()	
  	
  	
  //	
  no	
  problem,	
  no	
  need	
  to	
  cast

           	
  	
  	
  	
  var	
  =	
  123
           	
  	
  	
  	
  x	
  =	
  var.toUpperCase()	
  //	
  error,	
  var	
  is	
  int!
           }




                                                                                                                                     47
Gotchas: static checking vs dynamic
•   Type checking works at compile-time
    •adding @TypeChecked doesn’t change behavior
        •
       do not confuse with static compilation


•   Most dynamic features cannot be type checked
    •metaclass changes, categories
    •dynamically bound variables (ex: script’s binding)


•   However, compile-time metaprogramming works
    •as long as proper type information is defined

                                                          48
Gotchas: runtime metaprogramming
       @TypeChecked	
  
       void	
  test()	
  {
       	
  	
  	
  	
  Integer.metaClass.foo	
  =	
  {}
       	
  	
  	
  	
  123.foo()
       }




                                                          49
Gotchas: runtime metaprogramming
       @TypeChecked	
  
       void	
  test()	
  {
       	
  	
  	
  	
  Integer.metaClass.foo	
  =	
  {}
       	
  	
  	
  	
  123.foo()
       }




                                          Not allowed:
                                       metaClass property
                                          is dynamic



                                                            49
Gotchas: runtime metaprogramming
       @TypeChecked	
  
       void	
  test()	
  {
       	
  	
  	
  	
  Integer.metaClass.foo	
  =	
  {}
       	
  	
  	
  	
  123.foo()
       }



        Method not                        Not allowed:
        recognized                     metaClass property
                                          is dynamic



                                                            49
Gotchas: closures need explicit types
             @TypeChecked	
  test()	
  {
             	
  	
  	
  	
  ["a",	
  "b",	
  "c"].collect	
  {
             	
  	
  	
  	
  	
  	
  	
  	
  it.toUpperCase()	
  //	
  Not	
  OK
             	
  	
  	
  	
  }
             }




•   A «Groovy Enhancement Proposal» to address this issue



                                                                                   50
Gotchas: closures need explicit types
             @TypeChecked	
  test()	
  {
             	
  	
  	
  	
  ["a",	
  "b",	
  "c"].collect	
  {	
  String	
  it	
  -­‐>
             	
  	
  	
  	
  	
  	
  	
  	
  it.toUpperCase()	
  //	
  OK,	
  it’s	
  a	
  String
             	
  	
  	
  	
  }
             }




•   A «Groovy Enhancement Proposal» to address this issue



                                                                                                    50
Closure shared variables
  @TypeChecked	
  test()	
  {
  	
  	
  	
  	
  def	
  var	
  =	
  "abc"	
  	
  	
  	
  	
  	
  	
  
  	
  	
  	
  	
  def	
  cl	
  =	
  {	
  var	
  =	
  new	
  Date()	
  }
  	
  	
  	
  	
  cl()
  	
  	
  	
  	
  var.toUpperCase()	
  	
  //	
  Not	
  OK!
  }




                                                                          51
Closure shared variables
                                                              var assigned in the closure:
                                                               «shared closure variable»
  @TypeChecked	
  test()	
  {
  	
  	
  	
  	
  def	
  var	
  =	
  "abc"	
  	
  	
  	
  	
  	
  	
  
  	
  	
  	
  	
  def	
  cl	
  =	
  {	
  var	
  =	
  new	
  Date()	
  }
  	
  	
  	
  	
  cl()
  	
  	
  	
  	
  var.toUpperCase()	
  	
  //	
  Not	
  OK!
  }




                                                                                             51
Closure shared variables
                                                                                     var assigned in the closure:
                                                                                      «shared closure variable»
                         @TypeChecked	
  test()	
  {
                         	
  	
  	
  	
  def	
  var	
  =	
  "abc"	
  	
  	
  	
  	
  	
  	
  
Impossible to ensure
                         	
  	
  	
  	
  def	
  cl	
  =	
  {	
  var	
  =	
  new	
  Date()	
  }
  the assignment
                         	
  	
  	
  	
  cl()
   really happens
                         	
  	
  	
  	
  var.toUpperCase()	
  	
  //	
  Not	
  OK!
                         }




                                                                                                                    51
Closure shared variables
                                                                                     var assigned in the closure:
                                                                                      «shared closure variable»
                         @TypeChecked	
  test()	
  {
                         	
  	
  	
  	
  def	
  var	
  =	
  "abc"	
  	
  	
  	
  	
  	
  	
  
Impossible to ensure
                         	
  	
  	
  	
  def	
  cl	
  =	
  {	
  var	
  =	
  new	
  Date()	
  }
  the assignment
                         	
  	
  	
  	
  cl()
   really happens
                         	
  	
  	
  	
  var.toUpperCase()	
  	
  //	
  Not	
  OK!
                         }




                                 Only methods of the most specific
                                      compatible type (LUB)
                                  are allowed by the type checker

                                                                                                                    51
Closure shared variables
 class	
  A	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  {	
  void	
  foo()	
  {}	
  }
 class	
  B	
  extends	
  A	
  {	
  void	
  bar()	
  {}	
  }

 @TypeChecked	
  test()	
  {
 	
  	
  	
  	
  def	
  var	
  =	
  new	
  A()
 	
  	
  	
  	
  def	
  cl	
  =	
  {	
  var	
  =	
  new	
  B()	
  }
 	
  	
  	
  	
  cl()
 	
  	
  	
  	
  var.foo()	
  	
  	
  //	
  OK!
 }




                                                                                       52
Closure shared variables
 class	
  A	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  {	
  void	
  foo()	
  {}	
  }
 class	
  B	
  extends	
  A	
  {	
  void	
  bar()	
  {}	
  }

 @TypeChecked	
  test()	
  {
 	
  	
  	
  	
  def	
  var	
  =	
  new	
  A()
 	
  	
  	
  	
  def	
  cl	
  =	
  {	
  var	
  =	
  new	
  B()	
  }
 	
  	
  	
  	
  cl()
 	
  	
  	
  	
  var.foo()	
  	
  	
  //	
  OK!
 }



          var is at least
         an instance of A


                                                                                       52
Static Compilation

•   Given your Groovy code can be type checked...
    we can as well compile it «statically»


    •   ie. generate the same byte code as javac


•   Also interesting for those stuck in JDK < 7
    to benefit from performance improvements




                                                    53
Static Compilation: advantages
•    You gain:


    • Type safety
     • thanks to static type checking
      • static compilation builds upon static type checking
    • Faster code
     • as close as possible to Java’s performance
    • Code immune to «monkey patching»
     • metaprogramming badly used can interfere with framework code
    • Smaller bytecode size
                                                                      54
Static Compilation: disadvantages
•   But you loose:


    •   Dynamic features
        •metaclass changes, categories, etc.


    •   Dynamic method dispatch
        •although as close as possible to «dynamic» Groovy




                                                             55
Statically compiled & dyn. methods
        @CompileStatic
        String	
  greeting(String	
  name)	
  {
        	
  	
  	
  	
  //	
  call	
  method	
  with	
  dynamic	
  behavior
        	
  	
  	
  	
  //	
  but	
  with	
  proper	
  signature
        	
  	
  	
  	
  generateMarkup(name.toUpperCase())
        }
        	
  
        //	
  usual	
  dynamic	
  behavior
        String	
  generateMarkup(String	
  name)	
  {
        	
  	
  	
  	
  def	
  sw	
  =	
  new	
  StringWriter()
        	
  	
  	
  	
  new	
  MarkupBuilder(sw).html	
  {
        	
  	
  	
  	
  	
  	
  	
  	
  body	
  {
        	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  div	
  name
        	
  	
  	
  	
  	
  	
  	
  	
  }
        	
  	
  	
  	
  }
        	
  	
  	
  	
  sw.toString()
        }




                                                                              56
What about performance?
•   Comparisons between:


    •   Java


    •   Groovy static compilation — Groovy 2.0
    •   Groovy with primitive optimizations — Groovy 1.8+
    •   Groovy without optimizations — ≤ Groovy 1.7




                                                            57
What about performance?
                                            Pi (π)     Binary
                              Fibonacci
                                          quadrature   trees
                  Java         143 ms       93 ms       4.5 s

                  Static
1.7 1.8 2.0




                              145 ms        96 ms      6.9 s
               compilation
                Primitive      271 ms       103 ms     29.6 s
              optimizations
                No prim.      3200 ms      2590 ms     50.0 s
              optimizations

                                                                58
Summary
•   Main themes of the Groovy 2.0 release
    •Modularity


    •   Embark the JDK 7 enhancements
        •Project Coin
        •Invoke Dynamic


    •   Static aspects
        • Static type checking
        • Static compilation

                                            59
Summary




          ROCKS!
               60
61
Thank you!


                     e
            eL aforg pment
Gu illaum ovy Develo
            ro
He ad of G
                          om
               e@ gmail.c                                       u
                                                          mpea tter
       glaforg rge
 Email: @glafo                    rge
                                                      ha
                                             dric C re Commi
         :                 o/glafo m      Cé        Co
                        .t
 Twitter : http://gplus spot.co           G roovy                     gmail.c
                                                                              om
           +             pp                                        u@
  Google p://glaforge.a                                  c.ch ampea eau
  Blog: h
          tt
                                           Emai l: cedri dricchamp             au
                                                      @c  e         o/cc hampe
                                           T witter : http://gplus.t elix
                                                       :             m
                                            G oogle+ //jroller.com/
                                                     ttp:
                                             Blog: h




                                                                                    62
Questions & Answers
•   Got questions, really?
                             Q&A




                                      63
Image credits
•   Bugs bunny: http://storage.canalblog.com/63/56/517188/47634843.jpeg

•   Iceberg: http://hqworld.net/gallery/data/media/20/tip_of_the_iceberg.jpg

•   Bicycle: http://drunkcyclist.com/gallery/main.php?g2_view=core.DownloadItem&g2_itemId=2131&g2_serialNumber=2

•   Pills: http://www.we-ew.com/wp-content/uploads/2011/01/plan-b-pills.jpg

•   Chains: http://2.bp.blogspot.com/-GXDVqUYSCa0/TVdBsON4tdI/AAAAAAAAAW4/EgJOUmAxB28/s1600/breaking-chains5_copy9611.jpg

•   Oui nide iou: http://desencyclopedie.wikia.com/wiki/Fichier:Superdupont_we_need_you.jpg

•   Guitar: http://www.lelitteraire.com/IMG/breveon323.jpg

•   Trampoline: http://www.fitness-online.fr/images/trampoline-1-m.jpg

•   Curry: http://www.pot-a-epices.com/wp-content/uploads/2009/02/curry1.jpg

•   Slurp: http://www.ohpacha.com/218-532-thickbox/gamelle-slurp.jpg

•   Caution: http://www.jeunes-epinay-sur-seine.fr/wp-content/uploads/2010/11/caution-colocation.jpg

•   Grumpy: http://mafeuilledechou.fr/__oneclick_uploads/2010/05/grumpy.jpg

•   Modularity: http://php.jglobal.com/blog/wp-content/uploads/2009/11/modularity.jpg

•   Agenda: http://www.plombiereslesbains.fr/images/stories/agenda.jpg

•   Java 7: http://geeknizer.com/wp-content/uploads/java7.jpg

•   WIP: http://www.connetport.com/wp-content/uploads/Work_in_progress.svg_.png

•   Grumpy 2: http://grumpy.division-par-zero.fr/wp-content/images/grumpy.jpg

•   Road Runner: http://newspaper.li/static/4ada046b7772f0612fec4e3840142308.jpg

•   Porky: http://joshuadsandy.files.wordpress.com/2011/05/porky-pig-5.jpg

•   Will E help: http://www.clipart-fr.com/data/clipart/looney/looney_004.jpg

•   Coyote road runner: http://www.jenkle.com/wp-content/uploads/2010/12/coyote-wallpaper1.jpg

•   Bunny your turn: http://media.onsugar.com/files/2011/04/17/6/1437/14373728/0fff82f316705e6a_bugs-bunny.png

•   Comics bubble: http://ryan110gs.edublogs.org/files/2010/11/Speech_bubble_600x452-1grpxu6.png




                                                                                                                            64

More Related Content

More from Guillaume Laforge

Lift off with Groovy 2 at JavaOne 2013
Lift off with Groovy 2 at JavaOne 2013Lift off with Groovy 2 at JavaOne 2013
Lift off with Groovy 2 at JavaOne 2013
Guillaume Laforge
 
Groovy workshop à Mix-IT 2013
Groovy workshop à Mix-IT 2013Groovy workshop à Mix-IT 2013
Groovy workshop à Mix-IT 2013
Guillaume Laforge
 
Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013
Guillaume Laforge
 
Groovy 2 and beyond
Groovy 2 and beyondGroovy 2 and beyond
Groovy 2 and beyond
Guillaume Laforge
 
Groovy 2.0 webinar
Groovy 2.0 webinarGroovy 2.0 webinar
Groovy 2.0 webinar
Guillaume Laforge
 
Groovy Domain Specific Languages - SpringOne2GX 2012
Groovy Domain Specific Languages - SpringOne2GX 2012Groovy Domain Specific Languages - SpringOne2GX 2012
Groovy Domain Specific Languages - SpringOne2GX 2012
Guillaume Laforge
 
Groovy 1.8 and 2.0 at GR8Conf Europe 2012
Groovy 1.8 and 2.0 at GR8Conf Europe 2012Groovy 1.8 and 2.0 at GR8Conf Europe 2012
Groovy 1.8 and 2.0 at GR8Conf Europe 2012
Guillaume Laforge
 
Going to Mars with Groovy Domain-Specific Languages
Going to Mars with Groovy Domain-Specific LanguagesGoing to Mars with Groovy Domain-Specific Languages
Going to Mars with Groovy Domain-Specific Languages
Guillaume Laforge
 
GPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
GPars et PrettyTime - Paris JUG 2011 - Guillaume LaforgeGPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
GPars et PrettyTime - Paris JUG 2011 - Guillaume LaforgeGuillaume Laforge
 
Groovy Update - Guillaume Laforge - Greach 2011
Groovy Update - Guillaume Laforge - Greach 2011Groovy Update - Guillaume Laforge - Greach 2011
Groovy Update - Guillaume Laforge - Greach 2011
Guillaume Laforge
 
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Guillaume Laforge
 
Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...
Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...
Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...
Guillaume Laforge
 
Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...
Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...
Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...
Guillaume Laforge
 
Cloud foundry intro with groovy
Cloud foundry intro with groovyCloud foundry intro with groovy
Cloud foundry intro with groovyGuillaume Laforge
 
Groovy DSLs - S2GForum London 2011 - Guillaume Laforge
Groovy DSLs - S2GForum London 2011 - Guillaume LaforgeGroovy DSLs - S2GForum London 2011 - Guillaume Laforge
Groovy DSLs - S2GForum London 2011 - Guillaume Laforge
Guillaume Laforge
 
Gaelyk - Guillaume Laforge - GR8Conf Europe 2011
Gaelyk - Guillaume Laforge - GR8Conf Europe 2011Gaelyk - Guillaume Laforge - GR8Conf Europe 2011
Gaelyk - Guillaume Laforge - GR8Conf Europe 2011
Guillaume Laforge
 
Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011
Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011
Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011
Guillaume Laforge
 
Gaelyk - JFokus 2011 - Guillaume Laforge
Gaelyk - JFokus 2011 - Guillaume LaforgeGaelyk - JFokus 2011 - Guillaume Laforge
Gaelyk - JFokus 2011 - Guillaume Laforge
Guillaume Laforge
 
Groovy Ecosystem - JFokus 2011 - Guillaume Laforge
Groovy Ecosystem - JFokus 2011 - Guillaume LaforgeGroovy Ecosystem - JFokus 2011 - Guillaume Laforge
Groovy Ecosystem - JFokus 2011 - Guillaume Laforge
Guillaume Laforge
 
Groovy and Gaelyk - Lausanne JUG 2011 - Guillaume Laforge
Groovy and Gaelyk - Lausanne JUG 2011 - Guillaume LaforgeGroovy and Gaelyk - Lausanne JUG 2011 - Guillaume Laforge
Groovy and Gaelyk - Lausanne JUG 2011 - Guillaume Laforge
Guillaume Laforge
 

More from Guillaume Laforge (20)

Lift off with Groovy 2 at JavaOne 2013
Lift off with Groovy 2 at JavaOne 2013Lift off with Groovy 2 at JavaOne 2013
Lift off with Groovy 2 at JavaOne 2013
 
Groovy workshop à Mix-IT 2013
Groovy workshop à Mix-IT 2013Groovy workshop à Mix-IT 2013
Groovy workshop à Mix-IT 2013
 
Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013
 
Groovy 2 and beyond
Groovy 2 and beyondGroovy 2 and beyond
Groovy 2 and beyond
 
Groovy 2.0 webinar
Groovy 2.0 webinarGroovy 2.0 webinar
Groovy 2.0 webinar
 
Groovy Domain Specific Languages - SpringOne2GX 2012
Groovy Domain Specific Languages - SpringOne2GX 2012Groovy Domain Specific Languages - SpringOne2GX 2012
Groovy Domain Specific Languages - SpringOne2GX 2012
 
Groovy 1.8 and 2.0 at GR8Conf Europe 2012
Groovy 1.8 and 2.0 at GR8Conf Europe 2012Groovy 1.8 and 2.0 at GR8Conf Europe 2012
Groovy 1.8 and 2.0 at GR8Conf Europe 2012
 
Going to Mars with Groovy Domain-Specific Languages
Going to Mars with Groovy Domain-Specific LanguagesGoing to Mars with Groovy Domain-Specific Languages
Going to Mars with Groovy Domain-Specific Languages
 
GPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
GPars et PrettyTime - Paris JUG 2011 - Guillaume LaforgeGPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
GPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
 
Groovy Update - Guillaume Laforge - Greach 2011
Groovy Update - Guillaume Laforge - Greach 2011Groovy Update - Guillaume Laforge - Greach 2011
Groovy Update - Guillaume Laforge - Greach 2011
 
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
 
Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...
Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...
Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...
 
Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...
Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...
Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...
 
Cloud foundry intro with groovy
Cloud foundry intro with groovyCloud foundry intro with groovy
Cloud foundry intro with groovy
 
Groovy DSLs - S2GForum London 2011 - Guillaume Laforge
Groovy DSLs - S2GForum London 2011 - Guillaume LaforgeGroovy DSLs - S2GForum London 2011 - Guillaume Laforge
Groovy DSLs - S2GForum London 2011 - Guillaume Laforge
 
Gaelyk - Guillaume Laforge - GR8Conf Europe 2011
Gaelyk - Guillaume Laforge - GR8Conf Europe 2011Gaelyk - Guillaume Laforge - GR8Conf Europe 2011
Gaelyk - Guillaume Laforge - GR8Conf Europe 2011
 
Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011
Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011
Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011
 
Gaelyk - JFokus 2011 - Guillaume Laforge
Gaelyk - JFokus 2011 - Guillaume LaforgeGaelyk - JFokus 2011 - Guillaume Laforge
Gaelyk - JFokus 2011 - Guillaume Laforge
 
Groovy Ecosystem - JFokus 2011 - Guillaume Laforge
Groovy Ecosystem - JFokus 2011 - Guillaume LaforgeGroovy Ecosystem - JFokus 2011 - Guillaume Laforge
Groovy Ecosystem - JFokus 2011 - Guillaume Laforge
 
Groovy and Gaelyk - Lausanne JUG 2011 - Guillaume Laforge
Groovy and Gaelyk - Lausanne JUG 2011 - Guillaume LaforgeGroovy and Gaelyk - Lausanne JUG 2011 - Guillaume Laforge
Groovy and Gaelyk - Lausanne JUG 2011 - Guillaume Laforge
 

Recently uploaded

Best 20 SEO Techniques To Improve Website Visibility In SERP
Best 20 SEO Techniques To Improve Website Visibility In SERPBest 20 SEO Techniques To Improve Website Visibility In SERP
Best 20 SEO Techniques To Improve Website Visibility In SERP
Pixlogix Infotech
 
Energy Efficient Video Encoding for Cloud and Edge Computing Instances
Energy Efficient Video Encoding for Cloud and Edge Computing InstancesEnergy Efficient Video Encoding for Cloud and Edge Computing Instances
Energy Efficient Video Encoding for Cloud and Edge Computing Instances
Alpen-Adria-Universität
 
AI 101: An Introduction to the Basics and Impact of Artificial Intelligence
AI 101: An Introduction to the Basics and Impact of Artificial IntelligenceAI 101: An Introduction to the Basics and Impact of Artificial Intelligence
AI 101: An Introduction to the Basics and Impact of Artificial Intelligence
IndexBug
 
HCL Notes and Domino License Cost Reduction in the World of DLAU
HCL Notes and Domino License Cost Reduction in the World of DLAUHCL Notes and Domino License Cost Reduction in the World of DLAU
HCL Notes and Domino License Cost Reduction in the World of DLAU
panagenda
 
Main news related to the CCS TSI 2023 (2023/1695)
Main news related to the CCS TSI 2023 (2023/1695)Main news related to the CCS TSI 2023 (2023/1695)
Main news related to the CCS TSI 2023 (2023/1695)
Jakub Marek
 
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
saastr
 
UI5 Controls simplified - UI5con2024 presentation
UI5 Controls simplified - UI5con2024 presentationUI5 Controls simplified - UI5con2024 presentation
UI5 Controls simplified - UI5con2024 presentation
Wouter Lemaire
 
Driving Business Innovation: Latest Generative AI Advancements & Success Story
Driving Business Innovation: Latest Generative AI Advancements & Success StoryDriving Business Innovation: Latest Generative AI Advancements & Success Story
Driving Business Innovation: Latest Generative AI Advancements & Success Story
Safe Software
 
June Patch Tuesday
June Patch TuesdayJune Patch Tuesday
June Patch Tuesday
Ivanti
 
Skybuffer SAM4U tool for SAP license adoption
Skybuffer SAM4U tool for SAP license adoptionSkybuffer SAM4U tool for SAP license adoption
Skybuffer SAM4U tool for SAP license adoption
Tatiana Kojar
 
TrustArc Webinar - 2024 Global Privacy Survey
TrustArc Webinar - 2024 Global Privacy SurveyTrustArc Webinar - 2024 Global Privacy Survey
TrustArc Webinar - 2024 Global Privacy Survey
TrustArc
 
Choosing The Best AWS Service For Your Website + API.pptx
Choosing The Best AWS Service For Your Website + API.pptxChoosing The Best AWS Service For Your Website + API.pptx
Choosing The Best AWS Service For Your Website + API.pptx
Brandon Minnick, MBA
 
UiPath Test Automation using UiPath Test Suite series, part 6
UiPath Test Automation using UiPath Test Suite series, part 6UiPath Test Automation using UiPath Test Suite series, part 6
UiPath Test Automation using UiPath Test Suite series, part 6
DianaGray10
 
Salesforce Integration for Bonterra Impact Management (fka Social Solutions A...
Salesforce Integration for Bonterra Impact Management (fka Social Solutions A...Salesforce Integration for Bonterra Impact Management (fka Social Solutions A...
Salesforce Integration for Bonterra Impact Management (fka Social Solutions A...
Jeffrey Haguewood
 
Recommendation System using RAG Architecture
Recommendation System using RAG ArchitectureRecommendation System using RAG Architecture
Recommendation System using RAG Architecture
fredae14
 
Presentation of the OECD Artificial Intelligence Review of Germany
Presentation of the OECD Artificial Intelligence Review of GermanyPresentation of the OECD Artificial Intelligence Review of Germany
Presentation of the OECD Artificial Intelligence Review of Germany
innovationoecd
 
Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024
Jason Packer
 
20240609 QFM020 Irresponsible AI Reading List May 2024
20240609 QFM020 Irresponsible AI Reading List May 202420240609 QFM020 Irresponsible AI Reading List May 2024
20240609 QFM020 Irresponsible AI Reading List May 2024
Matthew Sinclair
 
How to Get CNIC Information System with Paksim Ga.pptx
How to Get CNIC Information System with Paksim Ga.pptxHow to Get CNIC Information System with Paksim Ga.pptx
How to Get CNIC Information System with Paksim Ga.pptx
danishmna97
 
Digital Marketing Trends in 2024 | Guide for Staying Ahead
Digital Marketing Trends in 2024 | Guide for Staying AheadDigital Marketing Trends in 2024 | Guide for Staying Ahead
Digital Marketing Trends in 2024 | Guide for Staying Ahead
Wask
 

Recently uploaded (20)

Best 20 SEO Techniques To Improve Website Visibility In SERP
Best 20 SEO Techniques To Improve Website Visibility In SERPBest 20 SEO Techniques To Improve Website Visibility In SERP
Best 20 SEO Techniques To Improve Website Visibility In SERP
 
Energy Efficient Video Encoding for Cloud and Edge Computing Instances
Energy Efficient Video Encoding for Cloud and Edge Computing InstancesEnergy Efficient Video Encoding for Cloud and Edge Computing Instances
Energy Efficient Video Encoding for Cloud and Edge Computing Instances
 
AI 101: An Introduction to the Basics and Impact of Artificial Intelligence
AI 101: An Introduction to the Basics and Impact of Artificial IntelligenceAI 101: An Introduction to the Basics and Impact of Artificial Intelligence
AI 101: An Introduction to the Basics and Impact of Artificial Intelligence
 
HCL Notes and Domino License Cost Reduction in the World of DLAU
HCL Notes and Domino License Cost Reduction in the World of DLAUHCL Notes and Domino License Cost Reduction in the World of DLAU
HCL Notes and Domino License Cost Reduction in the World of DLAU
 
Main news related to the CCS TSI 2023 (2023/1695)
Main news related to the CCS TSI 2023 (2023/1695)Main news related to the CCS TSI 2023 (2023/1695)
Main news related to the CCS TSI 2023 (2023/1695)
 
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
 
UI5 Controls simplified - UI5con2024 presentation
UI5 Controls simplified - UI5con2024 presentationUI5 Controls simplified - UI5con2024 presentation
UI5 Controls simplified - UI5con2024 presentation
 
Driving Business Innovation: Latest Generative AI Advancements & Success Story
Driving Business Innovation: Latest Generative AI Advancements & Success StoryDriving Business Innovation: Latest Generative AI Advancements & Success Story
Driving Business Innovation: Latest Generative AI Advancements & Success Story
 
June Patch Tuesday
June Patch TuesdayJune Patch Tuesday
June Patch Tuesday
 
Skybuffer SAM4U tool for SAP license adoption
Skybuffer SAM4U tool for SAP license adoptionSkybuffer SAM4U tool for SAP license adoption
Skybuffer SAM4U tool for SAP license adoption
 
TrustArc Webinar - 2024 Global Privacy Survey
TrustArc Webinar - 2024 Global Privacy SurveyTrustArc Webinar - 2024 Global Privacy Survey
TrustArc Webinar - 2024 Global Privacy Survey
 
Choosing The Best AWS Service For Your Website + API.pptx
Choosing The Best AWS Service For Your Website + API.pptxChoosing The Best AWS Service For Your Website + API.pptx
Choosing The Best AWS Service For Your Website + API.pptx
 
UiPath Test Automation using UiPath Test Suite series, part 6
UiPath Test Automation using UiPath Test Suite series, part 6UiPath Test Automation using UiPath Test Suite series, part 6
UiPath Test Automation using UiPath Test Suite series, part 6
 
Salesforce Integration for Bonterra Impact Management (fka Social Solutions A...
Salesforce Integration for Bonterra Impact Management (fka Social Solutions A...Salesforce Integration for Bonterra Impact Management (fka Social Solutions A...
Salesforce Integration for Bonterra Impact Management (fka Social Solutions A...
 
Recommendation System using RAG Architecture
Recommendation System using RAG ArchitectureRecommendation System using RAG Architecture
Recommendation System using RAG Architecture
 
Presentation of the OECD Artificial Intelligence Review of Germany
Presentation of the OECD Artificial Intelligence Review of GermanyPresentation of the OECD Artificial Intelligence Review of Germany
Presentation of the OECD Artificial Intelligence Review of Germany
 
Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024
 
20240609 QFM020 Irresponsible AI Reading List May 2024
20240609 QFM020 Irresponsible AI Reading List May 202420240609 QFM020 Irresponsible AI Reading List May 2024
20240609 QFM020 Irresponsible AI Reading List May 2024
 
How to Get CNIC Information System with Paksim Ga.pptx
How to Get CNIC Information System with Paksim Ga.pptxHow to Get CNIC Information System with Paksim Ga.pptx
How to Get CNIC Information System with Paksim Ga.pptx
 
Digital Marketing Trends in 2024 | Guide for Staying Ahead
Digital Marketing Trends in 2024 | Guide for Staying AheadDigital Marketing Trends in 2024 | Guide for Staying Ahead
Digital Marketing Trends in 2024 | Guide for Staying Ahead
 

Groovy 2.0 - Devoxx France 2012

  • 1. Groovy 2.0 Quoi de neuf, doc ? Guillaume Laforge Cédric Champeau Groovy Project Manager Groovy Core Committer @glaforge @cedrichampeau 1
  • 2. Groovy 2.0 Quoi de neuf, doc ? Guillaume Laforge Cédric Champeau Groovy Project Manager Groovy Core Committer @glaforge @cedrichampeau 1
  • 3. Guillaume Laforge • Groovy Project Manager at VMware •Initiator of the Grails framework •Creator of the Gaelyk and Caelyf toolkits • Co-author of Groovy in Action • Follow me on... •My blog: http://glaforge.appspot.com •Twitter: @glaforge •Google+: http://gplus.to/glaforge 2
  • 4. Cédric Champeau • Past: Groovy contributor then committer • Present: Groovy Core Developer at VMware •bug fixes with main focus on static type checking and static compilation • Follow me on... •My blog: http://jroller.com/melix •Twitter: @cedricchampeau •Google+: http://gplus.to/cchampeau 3
  • 5. Agenda (1/2) • What’s new in Groovy 1.8? • Nicer DSLs with command chains • Runtime performance improvements • GPars bundled for taming your multicores • Closure enhancements • Builtin JSON support • New AST transformations 4
  • 6. Agenda (2/2) • What’s cooking for Groovy 2.0? • Alignments with JDK 7 • Project Coin (small language changes) • Invoke Dynamic support • Continued runtime performance improvements • Static type checking • Static compilation • Modularity 5
  • 7. Command chains • A grammar improvement allowing you to drop dots & parens when chaining method calls • an extended version of top-level statements like println • Less dots, less parens allow you to •write more readable business rules •in almost plain English sentences • (or any language, of course) 6
  • 8. Command chains  turn  left    then  right   7
  • 9. Command chains Alternation of method names  turn  left    then  right   7
  • 10. Command chains Alternation of method names  turn  left    then  right   and parameters (even named ones) 7
  • 11. Command chains  turn  left    then  right   7
  • 12. Command chains Equivalent to:  turn  left    then  right            (        ).        (          ) 7
  • 13. Look Ma! N op are ns, no do ts!
  • 14. Command chains take  2    pills  of    chloroquinine    after    6  hours 9
  • 15. Command chains        (  ).          (    ).                            (          ).  (          ) take  2    pills  of    chloroquinine    after    6  hours 9
  • 17. Command chains //  methods  with  multiple  arguments  (commas) 10
  • 18. Command chains //  methods  with  multiple  arguments  (commas) take  coffee    with  sugar,  milk    and  liquor 10
  • 19. Command chains //  methods  with  multiple  arguments  (commas) take  coffee    with  sugar,  milk    and  liquor //  leverage  named-­‐args  as  punctuation 10
  • 20. Command chains //  methods  with  multiple  arguments  (commas) take  coffee    with  sugar,  milk    and  liquor //  leverage  named-­‐args  as  punctuation check  that:  margarita    tastes  good 10
  • 21. Command chains //  methods  with  multiple  arguments  (commas) take  coffee    with  sugar,  milk    and  liquor //  leverage  named-­‐args  as  punctuation check  that:  margarita    tastes  good //  closure  parameters  for  new  control  structures 10
  • 22. Command chains //  methods  with  multiple  arguments  (commas) take  coffee    with  sugar,  milk    and  liquor //  leverage  named-­‐args  as  punctuation check  that:  margarita    tastes  good //  closure  parameters  for  new  control  structures given  {}    when  {}    then  {} 10
  • 23. Command chains //  methods  with  multiple  arguments  (commas) take  coffee    with  sugar,  milk    and  liquor //  leverage  named-­‐args  as  punctuation check  that:  margarita    tastes  good //  closure  parameters  for  new  control  structures given  {}    when  {}    then  {} //  zero-­‐arg  methods  require  parens 10
  • 24. Command chains //  methods  with  multiple  arguments  (commas) take  coffee    with  sugar,  milk    and  liquor //  leverage  named-­‐args  as  punctuation check  that:  margarita    tastes  good //  closure  parameters  for  new  control  structures given  {}    when  {}    then  {} //  zero-­‐arg  methods  require  parens select  all    unique()  from  names 10
  • 25. Command chains //  methods  with  multiple  arguments  (commas) take  coffee    with  sugar,  milk    and  liquor //  leverage  named-­‐args  as  punctuation check  that:  margarita    tastes  good //  closure  parameters  for  new  control  structures given  {}    when  {}    then  {} //  zero-­‐arg  methods  require  parens select  all    unique()  from  names //  possible  with  an  odd  number  of  terms 10
  • 26. Command chains //  methods  with  multiple  arguments  (commas) take  coffee    with  sugar,  milk    and  liquor //  leverage  named-­‐args  as  punctuation check  that:  margarita    tastes  good //  closure  parameters  for  new  control  structures given  {}    when  {}    then  {} //  zero-­‐arg  methods  require  parens select  all    unique()  from  names //  possible  with  an  odd  number  of  terms take  3    cookies 10
  • 27. Command chains //  methods  with  multiple  arguments  (commas) take  coffee    with  sugar,  milk    and  liquor        (            ).        (                      ).      (            ) //  leverage  named-­‐args  as  punctuation check  that:  margarita    tastes  good //  closure  parameters  for  new  control  structures given  {}    when  {}    then  {} //  zero-­‐arg  methods  require  parens select  all    unique()  from  names //  possible  with  an  odd  number  of  terms take  3    cookies 10
  • 28. Command chains //  methods  with  multiple  arguments  (commas) take  coffee    with  sugar,  milk    and  liquor        (            ).        (                      ).      (            ) //  leverage  named-­‐args  as  punctuation check  that:  margarita    tastes  good          (                              ).            (        ) //  closure  parameters  for  new  control  structures given  {}    when  {}    then  {} //  zero-­‐arg  methods  require  parens select  all    unique()  from  names //  possible  with  an  odd  number  of  terms take  3    cookies 10
  • 29. Command chains //  methods  with  multiple  arguments  (commas) take  coffee    with  sugar,  milk    and  liquor        (            ).        (                      ).      (            ) //  leverage  named-­‐args  as  punctuation check  that:  margarita    tastes  good          (                              ).            (        ) //  closure  parameters  for  new  control  structures given  {}    when  {}    then  {}          (    ).        (    ).        (    ) //  zero-­‐arg  methods  require  parens select  all    unique()  from  names //  possible  with  an  odd  number  of  terms take  3    cookies 10
  • 30. Command chains //  methods  with  multiple  arguments  (commas) take  coffee    with  sugar,  milk    and  liquor        (            ).        (                      ).      (            ) //  leverage  named-­‐args  as  punctuation check  that:  margarita    tastes  good          (                              ).            (        ) //  closure  parameters  for  new  control  structures given  {}    when  {}    then  {}          (    ).        (    ).        (    ) //  zero-­‐arg  methods  require  parens select  all    unique()  from  names            (      ).                .        (          ) //  possible  with  an  odd  number  of  terms take  3    cookies 10
  • 31. Command chains //  methods  with  multiple  arguments  (commas) take  coffee    with  sugar,  milk    and  liquor        (            ).        (                      ).      (            ) //  leverage  named-­‐args  as  punctuation check  that:  margarita    tastes  good          (                              ).            (        ) //  closure  parameters  for  new  control  structures given  {}    when  {}    then  {}          (    ).        (    ).        (    ) //  zero-­‐arg  methods  require  parens select  all    unique()  from  names            (      ).                .        (          ) //  possible  with  an  odd  number  of  terms take  3    cookies        (  ). 10
  • 32. GPars bundled • GPars is bundled in the Groovy distribution • GPars covers a wide range of parallel and concurrent paradigms •actors, fork/join, map/filter/reduce, dataflow, agents •parallel arrays, executors, STM, and more... • And you can use it from plain Java as well! 11
  • 33. Closure enhancements • Closure annotation parameters • Some more functional flavor •composition: compose several closures into one single closure •trampoline: avoid stack overflow errors for recursive algorithms •memoization: remember the outcome of previous closure invocations •currying improvements 12
  • 34. Closure annotation parameters @Retention(RetentionPolicy.RUNTIME) @interface  Invariant  {                Class  value()  //  a  closure  class }   { @Invariant({  number  >=  0  }) class  Distance  {                float  number                String  unit }     def  d  =  new  Distance(number:  10,  unit:  "meters")   def  anno  =  Distance.getAnnotation(Invariant) def  check  =  anno.value().newInstance(d,  d) assert  check(d) 13
  • 35. Closure annotation parameters @Retention(RetentionPolicy.RUNTIME) @interface  Invariant  {                Class  value()  //  a  closure  class }   { @Invariant({  number  >=  0  }) class  Distance  {                float  number         Poor -man ’s GCo n tracts        String  unit }     def  d  =  new  Distance(number:  10,  unit:  "meters")   def  anno  =  Distance.getAnnotation(Invariant) def  check  =  anno.value().newInstance(d,  d) assert  check(d) 13
  • 37. Closure memoization def  plus  =  {  a,  b  -­‐>  sleep  1000;  a  +  b  }.memoize() 14
  • 38. Closure memoization def  plus  =  {  a,  b  -­‐>  sleep  1000;  a  +  b  }.memoize() assert  plus(1,  2)  ==  3  //  after  1000ms 14
  • 39. Closure memoization def  plus  =  {  a,  b  -­‐>  sleep  1000;  a  +  b  }.memoize() assert  plus(1,  2)  ==  3  //  after  1000ms assert  plus(1,  2)  ==  3  //  return  immediately 14
  • 40. Closure memoization def  plus  =  {  a,  b  -­‐>  sleep  1000;  a  +  b  }.memoize() assert  plus(1,  2)  ==  3  //  after  1000ms assert  plus(1,  2)  ==  3  //  return  immediately assert  plus(2,  2)  ==  4  //  after  1000ms 14
  • 41. Closure memoization def  plus  =  {  a,  b  -­‐>  sleep  1000;  a  +  b  }.memoize() assert  plus(1,  2)  ==  3  //  after  1000ms assert  plus(1,  2)  ==  3  //  return  immediately assert  plus(2,  2)  ==  4  //  after  1000ms assert  plus(2,  2)  ==  4  //  return  immediately     14
  • 42. Closure memoization def  plus  =  {  a,  b  -­‐>  sleep  1000;  a  +  b  }.memoize() assert  plus(1,  2)  ==  3  //  after  1000ms assert  plus(1,  2)  ==  3  //  return  immediately assert  plus(2,  2)  ==  4  //  after  1000ms assert  plus(2,  2)  ==  4  //  return  immediately       14
  • 43. Closure memoization def  plus  =  {  a,  b  -­‐>  sleep  1000;  a  +  b  }.memoize() assert  plus(1,  2)  ==  3  //  after  1000ms assert  plus(1,  2)  ==  3  //  return  immediately assert  plus(2,  2)  ==  4  //  after  1000ms assert  plus(2,  2)  ==  4  //  return  immediately       //  at  least  10  invocations  cached 14
  • 44. Closure memoization def  plus  =  {  a,  b  -­‐>  sleep  1000;  a  +  b  }.memoize() assert  plus(1,  2)  ==  3  //  after  1000ms assert  plus(1,  2)  ==  3  //  return  immediately assert  plus(2,  2)  ==  4  //  after  1000ms assert  plus(2,  2)  ==  4  //  return  immediately       //  at  least  10  invocations  cached def  plusAtLeast  =  {  ...  }.memoizeAtLeast(10) 14
  • 45. Closure memoization def  plus  =  {  a,  b  -­‐>  sleep  1000;  a  +  b  }.memoize() assert  plus(1,  2)  ==  3  //  after  1000ms assert  plus(1,  2)  ==  3  //  return  immediately assert  plus(2,  2)  ==  4  //  after  1000ms assert  plus(2,  2)  ==  4  //  return  immediately       //  at  least  10  invocations  cached def  plusAtLeast  =  {  ...  }.memoizeAtLeast(10)   14
  • 46. Closure memoization def  plus  =  {  a,  b  -­‐>  sleep  1000;  a  +  b  }.memoize() assert  plus(1,  2)  ==  3  //  after  1000ms assert  plus(1,  2)  ==  3  //  return  immediately assert  plus(2,  2)  ==  4  //  after  1000ms assert  plus(2,  2)  ==  4  //  return  immediately       //  at  least  10  invocations  cached def  plusAtLeast  =  {  ...  }.memoizeAtLeast(10)   //  at  most  10  invocations  cached 14
  • 47. Closure memoization def  plus  =  {  a,  b  -­‐>  sleep  1000;  a  +  b  }.memoize() assert  plus(1,  2)  ==  3  //  after  1000ms assert  plus(1,  2)  ==  3  //  return  immediately assert  plus(2,  2)  ==  4  //  after  1000ms assert  plus(2,  2)  ==  4  //  return  immediately       //  at  least  10  invocations  cached def  plusAtLeast  =  {  ...  }.memoizeAtLeast(10)   //  at  most  10  invocations  cached def  plusAtMost  =  {  ...  }.memoizeAtMost(10)   14
  • 48. Closure memoization def  plus  =  {  a,  b  -­‐>  sleep  1000;  a  +  b  }.memoize() assert  plus(1,  2)  ==  3  //  after  1000ms assert  plus(1,  2)  ==  3  //  return  immediately assert  plus(2,  2)  ==  4  //  after  1000ms assert  plus(2,  2)  ==  4  //  return  immediately       //  at  least  10  invocations  cached def  plusAtLeast  =  {  ...  }.memoizeAtLeast(10)   //  at  most  10  invocations  cached def  plusAtMost  =  {  ...  }.memoizeAtMost(10)   //  between  10  and  20  invocations  cached 14
  • 49. Closure memoization def  plus  =  {  a,  b  -­‐>  sleep  1000;  a  +  b  }.memoize() assert  plus(1,  2)  ==  3  //  after  1000ms assert  plus(1,  2)  ==  3  //  return  immediately assert  plus(2,  2)  ==  4  //  after  1000ms assert  plus(2,  2)  ==  4  //  return  immediately       //  at  least  10  invocations  cached def  plusAtLeast  =  {  ...  }.memoizeAtLeast(10)   //  at  most  10  invocations  cached def  plusAtMost  =  {  ...  }.memoizeAtMost(10)   //  between  10  and  20  invocations  cached def  plusAtLeast  =  {  ...  }.memoizeBetween(10,  20) 14
  • 50. Builtin JSON support • Consuming • Producing • Pretty-printing 15
  • 51. Builtin JSON support import  groovy.json.*   def  payload  =  new  URL(        "http://github.../json/commits/...").text   def  slurper  =  new  JsonSlurper() def  doc  =  slurper.parseText(payload)   doc.commits.message.each  {  println  it  } 16
  • 52. Builtin JSON support import  groovy.json.*     def  json  =  new  JsonBuilder()     json.person  {                name  "Guillaume"        age  34                pets  "Hector",  "Felix" }   println  json.toString() 17
  • 53. Builtin JSON support import  groovy.json.*     def  json  =  new  JsonBuilder()     {         json.person  {                "person":  {                        name  "Guillaume"                "name":  "Guillaume",                    age  34                        "age":  34,                                "pets":  [                                pets  "Hector",  "Felix"                        "Hector",                         }                          "Felix"                                ]         println  json.toString()        } } 17
  • 54. Builtin JSON support import  groovy.json.*     println  JsonOutput.prettyPrint(        '''{"person":{"name":"Guillaume","age":34,'''  +          '''"pets":["Hector","Felix"]}}''')   {                "person":  {                                "name":  "Guillaume",                        "age":  34,                                "pets":  [                                                "Hector",                                              "Felix"                                ]                } } 18
  • 55. New AST transformations • @Log • Controlling execution • @ThreadInterrupt • @Field • @TimedInterrupt • @ConditionalInterrupt • @AutoClone • @InheritConstructor • @AutoExternalizable • @Canonical • @WithReadLock • @ToString • @WithWriteLock • @EqualsAndHashCode • @TupleConstructor • @ListenerList 19
  • 56. @Log • Four different loggers can be injected •@Log import  groovy.util.logging.*   •   @Commons @Log •@Log4j class  Car  {                Car()  {                 •@Slf4j                log.info  'Car  constructed'              }   }   • Possible to implement   def  c  =  new  Car() your own strategy 20
  • 57. @Log • Four different loggers can be injected •@Log import  groovy.util.logging.*   •   @Commons @Log •@Log4j class  Car  {                Car()  {                 •@Slf4j Guarded w/ an if                log.info  'Car  constructed'              }   }   • Possible to implement   def  c  =  new  Car() your own strategy 20
  • 59. Controlling code execution • Your application may run user’s code •what if the code runs in infinite loops or for too long? •what if the code consumes too many resources? 21
  • 60. Controlling code execution • Your application may run user’s code •what if the code runs in infinite loops or for too long? •what if the code consumes too many resources? 21
  • 61. Controlling code execution • Your application may run user’s code •what if the code runs in infinite loops or for too long? •what if the code consumes too many resources? • 3 new transforms at your rescue • @ThreadInterrupt: adds Thread#isInterrupted checks so your executing thread stops when interrupted • @TimedInterrupt: adds checks in method and closure bodies to verify it’s run longer than expected • @ConditionalInterrupt: adds checks with your own conditional logic to break out from the user code 21
  • 62. @ThreadInterrupt @ThreadInterrupt import  groovy.transform.ThreadInterrupt     while  (true)  {        //  eat  lots  of  CPU } 22 33
  • 63. @ThreadInterrupt @ThreadInterrupt import  groovy.transform.ThreadInterrupt     while  (true)  { {        if  (Thread.currentThread.isInterrupted())                throw  new  InterruptedException() }        //  eat  lots  of  CPU } 22 33
  • 64. @ToString • Provides a default toString() method to your types • Available annotation options • includeNames, includeFields, includeSuper, excludes import  groovy.transform.ToString     @ToString class  Person  {                String  name                int  age }     println  new  Person(name:  'Pete',  age:  15) //  =>  Person(Pete,  15) 23
  • 65. @EqualsAndHashCode • Provides default implementations for equals() and hashCode() methods import  groovy.transform.EqualsAndHashCode     @EqualsAndHashCode class  Coord  {                int  x,  y }     def  c1  =  new  Coord(x:  20,  y:  5) def  c2  =  new  Coord(x:  20,  y:  5)     assert  c1  ==  c2 assert  c1.hashCode()  ==  c2.hashCode() 24
  • 66. @TupleConstructor • Provides a «classical» constructor with all properties • Several annotation parameter options available import  groovy.transform.TupleConstructor     @TupleConstructor   class  Person  {                String  name                int  age }     def  m  =  new  Person('Marion',  4)               assert  m.name  ==  'Marion' assert  m.age    ==  4 25
  • 67. @InheritConstructors • Classes like Exception are painful when extended, as all the base constructors should be replicated class  CustomException  extends  Exception  {        CustomException()                                                {  super()              }        CustomException(String  msg)                            {  super(msg)        }        CustomException(String  msg,  Throwable  t)  {  super(msg,  t)  }        CustomException(Throwable  t)                          {  super(t)            } } 26
  • 68. @InheritConstructors • Classes like Exception are painful when extended, as all the base constructors should be replicated import  groovy.transform.* @InheritConstructors class  CustomException  extends  Exception  {        CustomException()                                                {  super()              }        CustomException(String  msg)                            {  super(msg)        }        CustomException(String  msg,  Throwable  t)  {  super(msg,  t)  }        CustomException(Throwable  t)                          {  super(t)            } } 26
  • 69. Miscelanous • Compilation customizers • Java 7 diamond operator • Slashy and dollar slashy strings • New GDK methods • (G)String to Enum coercion • Customizing the Groovysh prompt • Executing remote scripts 27
  • 70. Compilation customizers • Ability to apply some customization to the Groovy compilation process • Three available customizers •ImportCustomizer •ASTTransformationCustomizer •SecureASTCustomizer • But you can implement your own 28
  • 71. Imports customizer def  configuration  =  new  CompilerConfiguration()   def  custo  =  new  ImportCustomizer() custo.addStaticStar(Math.name) configuration.addCompilationCustomizers(custo)     def  result  =  new  GroovyShell(configuration)                          //  import  static  java.lang.Math.*        .evaluate("  cos  PI/3  ")                             29
  • 73. Groovy 2.0 roadmap • Towards a more modular Groovy • Java 7 alignements: Project Coin • binary literals • underscore in literals • multicatch • JDK 7: InvokeDynamic • Static type checking • Static compilation 31
  • 74. Groovy Modularity • Groovy’s «all» JAR weighs in at 4MB • Nobody needs everything • Template engine, Ant scripting, Swing UI building... • Provide a smaller core •and several smaller JARs per feature • Provide hooks for setting up DGM methods, etc. 32
  • 75. Java 7 / JDK 7 • Project Coin and InvokeDynamic 33
  • 76. Binary literals • We had decimal, octal and hexadecimal notations for number literals • We can now use binary representations too int  x  =  0b10101111 assert  x  ==  175   byte  aByte  =  0b00100001 assert  aByte  ==  33   int  anInt  =  0b1010000101000101 assert  anInt  ==  41285 34
  • 77. Underscore in literals • Now we can also add underscores in number literals for more readability long  creditCardNumber  =  1234_5678_9012_3456L long  socialSecurityNumbers  =  999_99_9999L float  monetaryAmount  =  12_345_132.12 long  hexBytes  =  0xFF_EC_DE_5E long  hexWords  =  0xFFEC_DE5E long  maxLong  =  0x7fff_ffff_ffff_ffffL long  alsoMaxLong  =  9_223_372_036_854_775_807L long  bytes  =  0b11010010_01101001_10010100_10010010 35
  • 78. Multicatch • One block for multiple exception caught •rather than duplicating the block try  {        /*  ...  */ }  catch(IOException  |  NullPointerException  e)  {        /*  one  block  to  treat  2  exceptions  */ } 36
  • 80. InvokeDynamic • Groovy 2.0 supports JDK 7’s invokeDynamic • compiler has a flag for compiling against JDK 7 • might use the invokeDynamic backport for < JDK 7 • Benefits • more runtime performance! • at least as fast as current «dynamic» Groovy •in the long run, will allow us to get rid of code! • call site caching, thanks to MethodHandles • metaclass registry, thanks to ClassValues • will let the JIT inline calls more easily 38
  • 81. Static Type Checking • Goal: make the Groovy compiler «grumpy»! • and throw compilation errors (not at runtime) • Not everybody needs dynamic features all the time • think Java libraries scripting • Grumpy should... • tell you about your method or variable typos • complain if you call methods that don’t exist • shout on assignments of wrong types • infer the types of your variables • figure out GDK methods • etc... 39
  • 82. Typos in your variable or method import  groovy.transform.TypeChecked   void  method()  {}   @TypeChecked  test()  {        //  Cannot  find  matching  method  metthhoood()        metthhoood()          def  name  =  "Guillaume"        //  variable  naamme  is  undeclared        println  naamme } 40
  • 83. Typos in your variable or method import  groovy.transform.TypeChecked   void  method()  {}   @TypeChecked  test()  {        //  Cannot  find  matching  method  metthhoood()        metthhoood()          def  name  =  "Guillaume" Compilation        //  variable  naamme  is  undeclared errors!        println  naamme } 40
  • 84. Typos in your variable or method Annotation can be at import  groovy.transform.TypeChecked class or method level   void  method()  {}   @TypeChecked  test()  {        //  Cannot  find  matching  method  metthhoood()        metthhoood()          def  name  =  "Guillaume" Compilation        //  variable  naamme  is  undeclared errors!        println  naamme } 40
  • 85. Complain on wrong assignments //  cannot  assign  value  of  type...  to  variable... int  x  =  new  Object() Set  set  =  new  Object()   def  o  =  new  Object() int  x  =  o   String[]  strings  =  ['a','b','c'] int  str  =  strings[0]   //  cannot  find  matching  method  plus() int  i  =  0 i  +=  '1' 41
  • 86. Complain on wrong assignments //  cannot  assign  value  of  type...  to  variable... int  x  =  new  Object() Set  set  =  new  Object() Compilation   errors! def  o  =  new  Object() int  x  =  o   String[]  strings  =  ['a','b','c'] int  str  =  strings[0]   //  cannot  find  matching  method  plus() int  i  =  0 i  +=  '1' 41
  • 87. Complain on wrong return types //  checks  if/else  branch  return  values @TypeChecked int  method()  {        if  (true)  {  'String'  }        else  {  42  } } //  works  for  switch/case  &  try/catch/finally   //  transparent  toString()  implied @TypeChecked String  greeting(String  name)  {        def  sb  =  new  StringBuilder()        sb  <<  "Hi  "  <<  name } 42
  • 88. Complain on wrong return types //  checks  if/else  branch  return  values @TypeChecked int  method()  { Compilation        if  (true)  {  'String'  } error!        else  {  42  } } //  works  for  switch/case  &  try/catch/finally   //  transparent  toString()  implied @TypeChecked String  greeting(String  name)  {        def  sb  =  new  StringBuilder()        sb  <<  "Hi  "  <<  name } 42
  • 89. Type inference @TypeChecked  test()  {        def  name  =  "    Guillaume    "          //  String  type  infered  (even  inside  GString)        println  "NAME  =  ${name.toUpperCase()}"            //  Groovy  GDK  method  support        //  (GDK  operator  overloading  too)        println  name.trim()          int[]  numbers  =  [1,  2,  3]        //  Element  n  is  an  int        for  (int  n  in  numbers)  {                println  n        } } 43
  • 90. Statically checked & dyn. methods @TypeChecked String  greeting(String  name)  {        //  call  method  with  dynamic  behavior        //  but  with  proper  signature        generateMarkup(name.toUpperCase()) }   //  usual  dynamic  behavior String  generateMarkup(String  name)  {        def  sw  =  new  StringWriter()        new  MarkupBuilder(sw).html  {                body  {                        div  name                }        }        sw.toString() } 44
  • 91. Instanceof checks @TypeChecked   void  test(Object  val)  {        if  (val  instanceof  String)  {                println  val.toUpperCase()        }  else  if  (val  instanceof  Number)  {                println  "X"  *  val.intValue()        } } 45
  • 92. Instanceof checks No need @TypeChecked   for casts void  test(Object  val)  {        if  (val  instanceof  String)  {                println  val.toUpperCase()        }  else  if  (val  instanceof  Number)  {                println  "X"  *  val.intValue()        } } 45
  • 93. Instanceof checks No need @TypeChecked   for casts void  test(Object  val)  {        if  (val  instanceof  String)  {                println  val.toUpperCase()        }  else  if  (val  instanceof  Number)  {                println  "X"  *  val.intValue()        } } Can call String#multiply(int) from the Groovy Development Kit 45
  • 94. Lowest Upper Bound • Represents the lowest «super» type classes have in common •may be virtual (aka «non-denotable») @TypeChecked  test()  {        //  an  integer  and  a  BigDecimal        return  [1234,  3.14] } 46
  • 95. Lowest Upper Bound • Represents the lowest «super» type classes have in common •may be virtual (aka «non-denotable») @TypeChecked  test()  {        //  an  integer  and  a  BigDecimal        return  [1234,  3.14] } Inferred return type: List<Number> 46
  • 96. Flow typing • Static type checking shouldn’t complain even for bad coding practicies which work without type checks @TypeChecked  test()  {        def  var  =  123                  //  inferred  type  is  int        int  x  =  var                      //  var  is  an  int        var  =  "123"                      //  assign  var  with  a  String        x  =  var.toInteger()      //  no  problem,  no  need  to  cast        var  =  123        x  =  var.toUpperCase()  //  error,  var  is  int! } 47
  • 97. Gotchas: static checking vs dynamic • Type checking works at compile-time •adding @TypeChecked doesn’t change behavior • do not confuse with static compilation • Most dynamic features cannot be type checked •metaclass changes, categories •dynamically bound variables (ex: script’s binding) • However, compile-time metaprogramming works •as long as proper type information is defined 48
  • 98. Gotchas: runtime metaprogramming @TypeChecked   void  test()  {        Integer.metaClass.foo  =  {}        123.foo() } 49
  • 99. Gotchas: runtime metaprogramming @TypeChecked   void  test()  {        Integer.metaClass.foo  =  {}        123.foo() } Not allowed: metaClass property is dynamic 49
  • 100. Gotchas: runtime metaprogramming @TypeChecked   void  test()  {        Integer.metaClass.foo  =  {}        123.foo() } Method not Not allowed: recognized metaClass property is dynamic 49
  • 101. Gotchas: closures need explicit types @TypeChecked  test()  {        ["a",  "b",  "c"].collect  {                it.toUpperCase()  //  Not  OK        } } • A «Groovy Enhancement Proposal» to address this issue 50
  • 102. Gotchas: closures need explicit types @TypeChecked  test()  {        ["a",  "b",  "c"].collect  {  String  it  -­‐>                it.toUpperCase()  //  OK,  it’s  a  String        } } • A «Groovy Enhancement Proposal» to address this issue 50
  • 103. Closure shared variables @TypeChecked  test()  {        def  var  =  "abc"                      def  cl  =  {  var  =  new  Date()  }        cl()        var.toUpperCase()    //  Not  OK! } 51
  • 104. Closure shared variables var assigned in the closure: «shared closure variable» @TypeChecked  test()  {        def  var  =  "abc"                      def  cl  =  {  var  =  new  Date()  }        cl()        var.toUpperCase()    //  Not  OK! } 51
  • 105. Closure shared variables var assigned in the closure: «shared closure variable» @TypeChecked  test()  {        def  var  =  "abc"               Impossible to ensure        def  cl  =  {  var  =  new  Date()  } the assignment        cl() really happens        var.toUpperCase()    //  Not  OK! } 51
  • 106. Closure shared variables var assigned in the closure: «shared closure variable» @TypeChecked  test()  {        def  var  =  "abc"               Impossible to ensure        def  cl  =  {  var  =  new  Date()  } the assignment        cl() really happens        var.toUpperCase()    //  Not  OK! } Only methods of the most specific compatible type (LUB) are allowed by the type checker 51
  • 107. Closure shared variables class  A                      {  void  foo()  {}  } class  B  extends  A  {  void  bar()  {}  } @TypeChecked  test()  {        def  var  =  new  A()        def  cl  =  {  var  =  new  B()  }        cl()        var.foo()      //  OK! } 52
  • 108. Closure shared variables class  A                      {  void  foo()  {}  } class  B  extends  A  {  void  bar()  {}  } @TypeChecked  test()  {        def  var  =  new  A()        def  cl  =  {  var  =  new  B()  }        cl()        var.foo()      //  OK! } var is at least an instance of A 52
  • 109. Static Compilation • Given your Groovy code can be type checked... we can as well compile it «statically» • ie. generate the same byte code as javac • Also interesting for those stuck in JDK < 7 to benefit from performance improvements 53
  • 110. Static Compilation: advantages • You gain: • Type safety • thanks to static type checking • static compilation builds upon static type checking • Faster code • as close as possible to Java’s performance • Code immune to «monkey patching» • metaprogramming badly used can interfere with framework code • Smaller bytecode size 54
  • 111. Static Compilation: disadvantages • But you loose: • Dynamic features •metaclass changes, categories, etc. • Dynamic method dispatch •although as close as possible to «dynamic» Groovy 55
  • 112. Statically compiled & dyn. methods @CompileStatic String  greeting(String  name)  {        //  call  method  with  dynamic  behavior        //  but  with  proper  signature        generateMarkup(name.toUpperCase()) }   //  usual  dynamic  behavior String  generateMarkup(String  name)  {        def  sw  =  new  StringWriter()        new  MarkupBuilder(sw).html  {                body  {                        div  name                }        }        sw.toString() } 56
  • 113. What about performance? • Comparisons between: • Java • Groovy static compilation — Groovy 2.0 • Groovy with primitive optimizations — Groovy 1.8+ • Groovy without optimizations — ≤ Groovy 1.7 57
  • 114. What about performance? Pi (π) Binary Fibonacci quadrature trees Java 143 ms 93 ms 4.5 s Static 1.7 1.8 2.0 145 ms 96 ms 6.9 s compilation Primitive 271 ms 103 ms 29.6 s optimizations No prim. 3200 ms 2590 ms 50.0 s optimizations 58
  • 115. Summary • Main themes of the Groovy 2.0 release •Modularity • Embark the JDK 7 enhancements •Project Coin •Invoke Dynamic • Static aspects • Static type checking • Static compilation 59
  • 116. Summary ROCKS! 60
  • 117. 61
  • 118. Thank you! e eL aforg pment Gu illaum ovy Develo ro He ad of G om e@ gmail.c u mpea tter glaforg rge Email: @glafo rge ha dric C re Commi : o/glafo m Cé Co .t Twitter : http://gplus spot.co G roovy gmail.c om + pp u@ Google p://glaforge.a c.ch ampea eau Blog: h tt Emai l: cedri dricchamp au @c e o/cc hampe T witter : http://gplus.t elix : m G oogle+ //jroller.com/ ttp: Blog: h 62
  • 119. Questions & Answers • Got questions, really? Q&A 63
  • 120. Image credits • Bugs bunny: http://storage.canalblog.com/63/56/517188/47634843.jpeg • Iceberg: http://hqworld.net/gallery/data/media/20/tip_of_the_iceberg.jpg • Bicycle: http://drunkcyclist.com/gallery/main.php?g2_view=core.DownloadItem&g2_itemId=2131&g2_serialNumber=2 • Pills: http://www.we-ew.com/wp-content/uploads/2011/01/plan-b-pills.jpg • Chains: http://2.bp.blogspot.com/-GXDVqUYSCa0/TVdBsON4tdI/AAAAAAAAAW4/EgJOUmAxB28/s1600/breaking-chains5_copy9611.jpg • Oui nide iou: http://desencyclopedie.wikia.com/wiki/Fichier:Superdupont_we_need_you.jpg • Guitar: http://www.lelitteraire.com/IMG/breveon323.jpg • Trampoline: http://www.fitness-online.fr/images/trampoline-1-m.jpg • Curry: http://www.pot-a-epices.com/wp-content/uploads/2009/02/curry1.jpg • Slurp: http://www.ohpacha.com/218-532-thickbox/gamelle-slurp.jpg • Caution: http://www.jeunes-epinay-sur-seine.fr/wp-content/uploads/2010/11/caution-colocation.jpg • Grumpy: http://mafeuilledechou.fr/__oneclick_uploads/2010/05/grumpy.jpg • Modularity: http://php.jglobal.com/blog/wp-content/uploads/2009/11/modularity.jpg • Agenda: http://www.plombiereslesbains.fr/images/stories/agenda.jpg • Java 7: http://geeknizer.com/wp-content/uploads/java7.jpg • WIP: http://www.connetport.com/wp-content/uploads/Work_in_progress.svg_.png • Grumpy 2: http://grumpy.division-par-zero.fr/wp-content/images/grumpy.jpg • Road Runner: http://newspaper.li/static/4ada046b7772f0612fec4e3840142308.jpg • Porky: http://joshuadsandy.files.wordpress.com/2011/05/porky-pig-5.jpg • Will E help: http://www.clipart-fr.com/data/clipart/looney/looney_004.jpg • Coyote road runner: http://www.jenkle.com/wp-content/uploads/2010/12/coyote-wallpaper1.jpg • Bunny your turn: http://media.onsugar.com/files/2011/04/17/6/1437/14373728/0fff82f316705e6a_bugs-bunny.png • Comics bubble: http://ryan110gs.edublogs.org/files/2010/11/Speech_bubble_600x452-1grpxu6.png 64