SlideShare a Scribd company logo
Groovy 2.0
  What’s up doc?
Guillaume Laforge Cédric Champeau
Groovy Project Manager Groovy Committer
      @glaforge        @cedricchampeau




                                          1
Groovy 2.0
  What’s up doc?
Guillaume Laforge Cédric Champeau
Groovy Project Manager Groovy Committer
      @glaforge        @cedricchampeau




                                          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?
 • Modularity
 • Alignments with JDK 7
  • Project Coin (small language changes)
  • Invoke Dynamic support
   • Continued runtime performance improvements
 • Static type checking
 • Static compilation
                                                  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




	
  pull	
  request	
  	
  on	
  github	
  




                                              7
Command chains
  Alternation of
  method names




	
  pull	
  request	
  	
  on	
  github	
  




                                              7
Command chains
  Alternation of
  method names




	
  pull	
  request	
  	
  on	
  github	
  


              and parameters
            (even named ones)



                                              7
Command chains




	
  pull	
  request	
  	
  on	
  github	
  




                                              7
Command chains



    Equivalent to:

	
  pull	
  request	
  	
  on	
  github	
  
	
  	
  	
  	
  	
  (	
  	
  	
  	
  	
  	
  	
  ).	
  	
  (	
  	
  	
  	
  	
  	
  )




                                                                                        7
Command chains




commit	
  2	
  	
  changes	
  on	
  	
  master	
  	
  branch




                                                               8
Command chains




	
  	
  	
  	
  	
  	
  (	
  ).	
  	
  	
  	
  	
  	
  	
  (	
  	
  ).	
  	
  	
  	
  	
  	
  	
  (	
  	
  	
  	
  	
  	
  )
commit	
  2	
  	
  changes	
  on	
  	
  master	
  	
  branch




                                                                                                                               8
Command chains




                 9
Command chains

//	
  methods	
  with	
  multiple	
  arguments	
  (commas)




                                                             9
Command chains

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




                                                                    9
Command chains

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

//	
  leverage	
  named-­‐args	
  as	
  punctuation




                                                                    9
Command chains

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

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




                                                                    9
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




                                                                     9
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	
  {}




                                                                     9
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




                                                                     9
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




                                                                     9
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




                                                                     9
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



                                                                     9
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



                                                                                                                                                   9
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



                                                                                                                                                   9
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



                                                                                                                                                   9
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



                                                                                                                                                   9
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
	
  	
  	
  	
  (	
  ).



                                                                                                                                                   9
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!




                                                            10
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

                                                           11
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)


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

{   @Invariant({	
  number	
  >=	
  0	
  })
    class	
  Distance	
  {	
  	
  	
  	
  
    	
  	
  	
  	
  float	
  number	
  	
  	
  	
  
                                                        Poor-   man’s
                                                                      GCon 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)


                                                                                    12
Closure memoization




                      13
Closure memoization

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




                                                                                           13
Closure memoization

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

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




                                                                                           13
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




                                                                                           13
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




                                                                                           13
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	
  	
  




                                                                                           13
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	
  	
  
	
  




                                                                                           13
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




                                                                                           13
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)




                                                                                           13
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)
	
  




                                                                                           13
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




                                                                                           13
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)	
  




                                                                                           13
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



                                                                                           13
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)


                                                                                           13
Builtin JSON support


•   Consuming


•   Producing


•   Pretty-printing




                                       14
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	
  }




                                                                15
Builtin JSON support

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




                                               16
Builtin JSON support

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



                                                                                                                                       16
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"	
  	
  	
  	
  	
  	
  	
  	
  
               	
  	
  	
  	
  	
  	
  	
  	
  ]	
  	
  	
  	
  
               	
  	
  	
  	
  }
               }
                                                                                                                   17
New AST transformations

• @Log                         • Controlling execution
                                   •   @ThreadInterrupt

•   @Field                         •   @TimedInterrupt
                                   •   @ConditionalInterrupt


•   @AutoClone
                               • @InheritConstructor
•   @AutoExternalizable

                               •   @WithReadLock
•   @Canonical
                               •   @WithWriteLock
    •   @ToString
    •   @EqualsAndHashCode
    •   @TupleConstructor      •   @ListenerList

                                                               18
@Log

•   Four different loggers can be injected
    •@Log
    •@Commons                   import	
  groovy.util.logging.*	
  
    •@Log4j                     	
  
                                @Log
    •@Slf4j                     class	
  Car	
  {	
  	
  	
  	
  
                                  	
  	
  	
  	
  Car()	
  {	
  	
  	
  	
  	
  	
  	
  	
  
                                  	
  	
  	
  	
  	
  	
  	
  	
  log.info	
  'Car	
  constructed'	
  
                                                                                                   	
  

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




                                                                                                    19
@Log

•   Four different loggers can be injected
    •@Log
    •@Commons                   import	
  groovy.util.logging.*	
  
    •@Log4j                     	
  
                                @Log
    •@Slf4j
                   Guarded
                    w/ an if
                                class	
  Car	
  {	
  	
  	
  	
  
                                  	
  	
  	
  	
  Car()	
  {	
  	
  	
  	
  	
  	
  	
  	
  
                                  	
  	
  	
  	
  	
  	
  	
  	
  log.info	
  'Car	
  constructed'	
  
                                                                                                   	
  

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




                                                                                                    19
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
                                                               20
@ThreadInterrupt


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


	
  	
  	
  	
  //	
  eat	
  lots	
  of	
  CPU
}




                                                 21


                                                      33
@ThreadInterrupt


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

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




                                                                                 21


                                                                                      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)

                                                                                22
@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()

                                                                       23
@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

                                                                                      24
@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)	
  	
  	
  	
  	
  	
  }
    }




                                                                                                                                                                                 25
@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)	
  	
  	
  	
  	
  	
  }
    }




                                                                                                                                                                                 25
Miscellaneous

•   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




                                       26
Compilation customizers

•   Ability to apply some customization to the Groovy
    compilation process


•   Three available customizers
    •ImportCustomizer
    •ASTTransformationCustomizer
    •SecureASTCustomizer


•   But you can implement your own


                                                        27
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	
  ")
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  




                                                                                                 28
What’s
in store
for 2.0?
2.0


Around the corner...
Groovy 2.0

•   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 6 MB


• 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
The new JARs

•   A smaller groovy.jar: 3MB


•   Modules
    •console                    •   sql
    •docgenerator               •   swing
    •groovydoc                  •   servlet
    •groovysh                   •   templates
    •ant                        •   test
    •bsf                        •   testng
    •jsr-223                    •   json
    •jmx                        •   xml
                                                33
Extension modules

•   Create your own module
    •contribute instance extension methods

package	
  foo

class	
  StringExtension	
  {
	
  	
  	
  	
  static	
  introduce(String	
  self,	
  String	
  name)	
  {
	
  	
  	
  	
  	
  	
  	
  	
  "Hi	
  ${name),	
  I’m	
  ${self}"
	
  	
  	
  	
  }
}

//	
  usage:	
  "Guillaume".introduce("Cédric")


                                                                              34
Extension modules

•   Create your own module
    •contribute instance extension methods                   Same structure
                                                              as Categories

package	
  foo

class	
  StringExtension	
  {
	
  	
  	
  	
  static	
  introduce(String	
  self,	
  String	
  name)	
  {
	
  	
  	
  	
  	
  	
  	
  	
  "Hi	
  ${name),	
  I’m	
  ${self}"
	
  	
  	
  	
  }
}

//	
  usage:	
  "Guillaume".introduce("Cédric")


                                                                              34
Extension modules

•   Create your own module
    •contribute class extension methods

             package	
  foo

             class	
  StaticStringExtension	
  {
             	
  	
  	
  	
  static	
  hi(String	
  self)	
  {
             	
  	
  	
  	
  	
  	
  	
  	
  "Hi!"
             	
  	
  	
  	
  }
             }

             //	
  usage:	
  String.hi()


                                                                 35
Extension module descriptor

•   Descriptor in: META-INF/services/
    org.codehaus.groovy.runtime.ExtensionModule


moduleName	
  =	
  stringExtensions
moduleVersion	
  =	
  1.0
//	
  comma-­‐separated	
  list	
  of	
  classes
extensionClasses	
  =	
  foo.StringExtension
//	
  comma-­‐separated	
  list	
  of	
  classes
staticExtensionClasses	
  =	
  foo.StaticStringExtension




                                                           36
Java 7 / JDK 7


•   Project Coin and InvokeDynamic




                                     37
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


                                                           38
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



                                                                  39
Multicatch

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



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




                                                                                     40
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
                                                          41
Your
turn!



        42
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...
                                                        43
Typos in a vars or methods

import	
  groovy.transform.TypeChecked
	
  
void	
  method()	
  {}
	
  
@TypeChecked	
  test()	
  {
	
  	
  	
  	
  //	
  Cannot	
  find	
  matching	
  method	
  metthhoood()
	
  	
  	
  	
  metthhoood()
	
  
	
  	
  	
  	
  def	
  name	
  =	
  "Guillaume"
	
  	
  	
  	
  //	
  variable	
  naamme	
  is	
  undeclared
	
  	
  	
  	
  println	
  naamme
}



                                                                             44
Typos in a vars or methods

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
}



                                                                                    44
Typos in a vars or methods

                                                            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
}



                                                                                    44
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'




                                                                        45
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'




                                                                                   45
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
}


                                                              46
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
}


                                                                     46
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
	
  	
  	
  	
  }
}

                                                                                 47
Statically checked & dyn meth

@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()
}

                                                                      48
Instanceof checks

@TypeChecked	
  
void	
  test(Object	
  val)	
  {

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

}




                                                                        49
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()
	
  	
  	
  	
  }

}




                                                                                49
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

                                                                                 49
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]
          }




                                                                          50
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 & Comparable>
                                                                          50
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 & Comparable>
                                                                          50
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!
    }



                                                                                                                              51
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

                                                          52
Runtime metaprogramming

@TypeChecked	
  
void	
  test()	
  {
	
  	
  	
  	
  Integer.metaClass.foo	
  =	
  {}
	
  	
  	
  	
  123.foo()
}




                                                   53
Runtime metaprogramming

@TypeChecked	
  
void	
  test()	
  {
	
  	
  	
  	
  Integer.metaClass.foo	
  =	
  {}
	
  	
  	
  	
  123.foo()
}



                           Not allowed:
                        metaClass property
                           is dynamic


                                                   53
Runtime metaprogramming

@TypeChecked	
  
void	
  test()	
  {
	
  	
  	
  	
  Integer.metaClass.foo	
  =	
  {}
	
  	
  	
  	
  123.foo()
}



   Method not              Not allowed:
   recognized           metaClass property
                           is dynamic


                                                   53
Explicit type for closures

@TypeChecked	
  test()	
  {
	
  	
  	
  	
  ["a",	
  "b",	
  "c"].collect	
  {
	
  	
  	
  	
  	
  	
  	
  	
  it.toUpperCase()	
  //	
  Not	
  OK
	
  	
  	
  	
  }
}



•   A « Groovy Enhancement Proposal » to address the issue




                                                                      54
Explicit type for closures

@TypeChecked	
  test()	
  {
	
  	
  	
  	
  ["a",	
  "b",	
  "c"].collect	
  {	
  String	
  it	
  -­‐>
	
  	
  	
  	
  	
  	
  	
  	
  it.toUpperCase()	
  //	
  OK,	
  it’s	
  a	
  String
	
  	
  	
  	
  }
}



•   A « Groovy Enhancement Proposal » to address the issue




                                                                                       54
Closure shared variables


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




                                                                        55
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!
}




                                                                        55
Closure shared variables
                                                        var assigned in the closure:
                                                         «shared closure variable»

                 @TypeChecked	
  test()	
  {
 Impossible to
                 	
  	
  	
  	
  def	
  var	
  =	
  "abc"	
  	
  	
  	
  	
  	
  	
  
  ensure the
                 	
  	
  	
  	
  def	
  cl	
  =	
  {	
  var	
  =	
  new	
  Date()	
  }
 assignment
                 	
  	
  	
  	
  cl()
really happens
                 	
  	
  	
  	
  var.toUpperCase()	
  	
  //	
  Not	
  OK!
                 }




                                                                                         55
Closure shared variables
                                                        var assigned in the closure:
                                                         «shared closure variable»

                 @TypeChecked	
  test()	
  {
 Impossible to
                 	
  	
  	
  	
  def	
  var	
  =	
  "abc"	
  	
  	
  	
  	
  	
  	
  
  ensure the
                 	
  	
  	
  	
  def	
  cl	
  =	
  {	
  var	
  =	
  new	
  Date()	
  }
 assignment
                 	
  	
  	
  	
  cl()
really happens
                 	
  	
  	
  	
  var.toUpperCase()	
  	
  //	
  Not	
  OK!
                 }



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

                                                                                         55
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!
}




                                                                                      56
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

                                                                                      56
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




                                                    57
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
                                                              58
Disadvantages

•   But you loose:


    •   Dynamic features
        •metaclass changes, categories, etc.


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




                                                             59
Statically compiled & dyn meth
@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()
}

                                                                      60
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)




                                                       61
What about performance?

                                            Pi (π)     Binary
                              Fibonacci
                                          quadrature   trees

                  Java        188 ms        97 ms      3.6 s

                Static
1.7 1.8 2.0




              compilation
                              202 ms      101 ms       4.4 s

                Primitive
              optimizations
                              360 ms       111 ms      23.7 s

                No prim.
              optimizations
                              2590 ms     3220 ms      50.0 s


                                                                62
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

                                            63
64
Thank you!



                     e
            eL aforg pment
Gu illaum ovy Develo
            ro
He ad of G
                          om
                  gmail.c                                     au
               e@
       glaforg rge                                Ch  ampe itter
 Email: @glafo                    rge     édric ore Comm
         :              .t o/glafo m    C
 Twitter : http://gplus spot.co         Groov
                                               yC
                                                                       gmail.c
                                                                               om
           +             pp
  Google p://glaforge.a                                          au@
                                                           hampe peau
          tt                                         ric.c
  Blog: h                                   ail: ced edriccham                  eau
                                         Em
                                                  :@   c           to/cchamp
                                          Twitter : http://gplus. melix
                                                   +                /
                                           Google p://jroller.com
                                                   tt
                                           Blog: h




                                                                                      65
Questions & Answers

•   Got questions, really?


                             Q&A




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

•   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

•   Slurp: http://www.ohpacha.com/218-532-thickbox/gamelle-slurp.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

•   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

•   Around the corner: http://3.bp.blogspot.com/-wvfO5NUbi8Q/TzBqTh4SOsI/AAAAAAAADOg/lRE9XVHGiOc/s1600/around-the-corner_large.jpg

•   Lube: http://images.motorcycle-superstore.com/ProductImages/OG/0000_Motul_Chain_Lube_Road_--.jpg




                                                                                                                                     67
Groovy 1.8   AST Transform   @Grab



 1   // methods with multiple arguments (commas)
 2   take coffee  with sugar, milk  and liquor
 3
 4   // leverage named-args as punctuation
 5   check that: margarita  tastes good
 6
 7   // closure parameters for new control structures
 8   given {}  when {}  then {}
 9
10   // zero-arg methods require parens
11   select all  unique() from names
12
13   // possible with an odd number of terms
14   take 3  cookies
Groovy 1.8   AST Transform   @Grab



 1   // methods with multiple arguments (commas)
 2   take coffee  with sugar, milk  and liquor
 3
 4   // leverage named-args as punctuation
 5   check that: margarita  tastes good      Need parens
 6
 7   // closure parameters for new control
                                                there!
                                             structures
 8   given {}  when {}  then {}
 9
10   // zero-arg methods require parens
11   select all  unique() from names
12
13   // possible with an odd number of terms
14   take 3  cookies

More Related Content

What's hot

Groovy 2.0 - Devoxx France 2012
Groovy 2.0 - Devoxx France 2012Groovy 2.0 - Devoxx France 2012
Groovy 2.0 - Devoxx France 2012
Guillaume Laforge
 
Whats new in Groovy 2.0?
Whats new in Groovy 2.0?Whats new in Groovy 2.0?
Whats new in Groovy 2.0?
Guillaume Laforge
 
Groovy update - S2GForum London 2011 - Guillaume Laforge
Groovy update - S2GForum London 2011 - Guillaume LaforgeGroovy update - S2GForum London 2011 - Guillaume Laforge
Groovy update - S2GForum London 2011 - Guillaume Laforge
Guillaume Laforge
 
Intro to pl/PHP Oscon2007
Intro to pl/PHP Oscon2007Intro to pl/PHP Oscon2007
Intro to pl/PHP Oscon2007
Robert Treat
 
What you need to remember when you upload to CPAN
What you need to remember when you upload to CPANWhat you need to remember when you upload to CPAN
What you need to remember when you upload to CPAN
charsbar
 
Centos config
Centos configCentos config
Centos config
Muhammad Abdi
 
Ten common mistakes made in Function Java
Ten common mistakes made in Function JavaTen common mistakes made in Function Java
Ten common mistakes made in Function Java
Brian Vermeer
 
Ten common mistakes made in Function Java - iSense Java Summit
Ten common mistakes made in Function Java - iSense Java SummitTen common mistakes made in Function Java - iSense Java Summit
Ten common mistakes made in Function Java - iSense Java Summit
Brian Vermeer
 
Athenticated smaba server config with open vpn
Athenticated smaba server  config with open vpnAthenticated smaba server  config with open vpn
Athenticated smaba server config with open vpn
Chanaka Lasantha
 
Postgres-BDR with Google Cloud Platform
Postgres-BDR with Google Cloud PlatformPostgres-BDR with Google Cloud Platform
Postgres-BDR with Google Cloud Platform
SungJae Yun
 
Adb instructions
Adb instructionsAdb instructions
Adb instructions
rklsaraswathi
 
Xen server 6.0 xe command reference (1.1)
Xen server 6.0 xe command reference (1.1)Xen server 6.0 xe command reference (1.1)
Xen server 6.0 xe command reference (1.1)
Timote Lima
 
23769377 lab-bgp-juniper
23769377 lab-bgp-juniper23769377 lab-bgp-juniper
23769377 lab-bgp-junipercavang_3004
 
Hadoop completereference
Hadoop completereferenceHadoop completereference
Hadoop completereference
arunkumar sadhasivam
 
Refcard en-a4
Refcard en-a4Refcard en-a4
Refcard en-a4
Arduino Aficionado
 
Common mistakes functional java | Oracle Code One 2018
Common mistakes functional java | Oracle Code One 2018Common mistakes functional java | Oracle Code One 2018
Common mistakes functional java | Oracle Code One 2018
Brian Vermeer
 
Common mistakes functional java vjug
Common mistakes functional java vjugCommon mistakes functional java vjug
Common mistakes functional java vjug
Brian Vermeer
 
Ten common mistakes made with Functional Java JBCNConf18
Ten common mistakes made with Functional Java JBCNConf18Ten common mistakes made with Functional Java JBCNConf18
Ten common mistakes made with Functional Java JBCNConf18
Brian Vermeer
 
Optimizer Cost Model MySQL 5.7
Optimizer Cost Model MySQL 5.7Optimizer Cost Model MySQL 5.7
Optimizer Cost Model MySQL 5.7
I Goo Lee
 

What's hot (20)

Groovy 2.0 - Devoxx France 2012
Groovy 2.0 - Devoxx France 2012Groovy 2.0 - Devoxx France 2012
Groovy 2.0 - Devoxx France 2012
 
Whats new in Groovy 2.0?
Whats new in Groovy 2.0?Whats new in Groovy 2.0?
Whats new in Groovy 2.0?
 
Groovy update - S2GForum London 2011 - Guillaume Laforge
Groovy update - S2GForum London 2011 - Guillaume LaforgeGroovy update - S2GForum London 2011 - Guillaume Laforge
Groovy update - S2GForum London 2011 - Guillaume Laforge
 
Intro to pl/PHP Oscon2007
Intro to pl/PHP Oscon2007Intro to pl/PHP Oscon2007
Intro to pl/PHP Oscon2007
 
What you need to remember when you upload to CPAN
What you need to remember when you upload to CPANWhat you need to remember when you upload to CPAN
What you need to remember when you upload to CPAN
 
Advanced GAR
Advanced GARAdvanced GAR
Advanced GAR
 
Centos config
Centos configCentos config
Centos config
 
Ten common mistakes made in Function Java
Ten common mistakes made in Function JavaTen common mistakes made in Function Java
Ten common mistakes made in Function Java
 
Ten common mistakes made in Function Java - iSense Java Summit
Ten common mistakes made in Function Java - iSense Java SummitTen common mistakes made in Function Java - iSense Java Summit
Ten common mistakes made in Function Java - iSense Java Summit
 
Athenticated smaba server config with open vpn
Athenticated smaba server  config with open vpnAthenticated smaba server  config with open vpn
Athenticated smaba server config with open vpn
 
Postgres-BDR with Google Cloud Platform
Postgres-BDR with Google Cloud PlatformPostgres-BDR with Google Cloud Platform
Postgres-BDR with Google Cloud Platform
 
Adb instructions
Adb instructionsAdb instructions
Adb instructions
 
Xen server 6.0 xe command reference (1.1)
Xen server 6.0 xe command reference (1.1)Xen server 6.0 xe command reference (1.1)
Xen server 6.0 xe command reference (1.1)
 
23769377 lab-bgp-juniper
23769377 lab-bgp-juniper23769377 lab-bgp-juniper
23769377 lab-bgp-juniper
 
Hadoop completereference
Hadoop completereferenceHadoop completereference
Hadoop completereference
 
Refcard en-a4
Refcard en-a4Refcard en-a4
Refcard en-a4
 
Common mistakes functional java | Oracle Code One 2018
Common mistakes functional java | Oracle Code One 2018Common mistakes functional java | Oracle Code One 2018
Common mistakes functional java | Oracle Code One 2018
 
Common mistakes functional java vjug
Common mistakes functional java vjugCommon mistakes functional java vjug
Common mistakes functional java vjug
 
Ten common mistakes made with Functional Java JBCNConf18
Ten common mistakes made with Functional Java JBCNConf18Ten common mistakes made with Functional Java JBCNConf18
Ten common mistakes made with Functional Java JBCNConf18
 
Optimizer Cost Model MySQL 5.7
Optimizer Cost Model MySQL 5.7Optimizer Cost Model MySQL 5.7
Optimizer Cost Model MySQL 5.7
 

Similar to Groovy 1.8 et 2.0 au BreizhC@mp 2012

Using the Command Line: Bash and WP-CLI
Using the Command Line: Bash and WP-CLIUsing the Command Line: Bash and WP-CLI
Using the Command Line: Bash and WP-CLI
Marc Gratch
 
DevOps hackathon Session 2: Basics of Chef
DevOps hackathon Session 2: Basics of ChefDevOps hackathon Session 2: Basics of Chef
DevOps hackathon Session 2: Basics of Chef
Antons Kranga
 
Coffeescript intro
Coffeescript   introCoffeescript   intro
Coffeescript intro
Dimitar Danailov
 
PostgreSQL 12: What is coming up?, Enterprise Postgres Day
PostgreSQL 12: What is coming up?, Enterprise Postgres DayPostgreSQL 12: What is coming up?, Enterprise Postgres Day
PostgreSQL 12: What is coming up?, Enterprise Postgres Day
EDB
 
How Does Kubernetes Build OpenAPI Specifications?
How Does Kubernetes Build OpenAPI Specifications?How Does Kubernetes Build OpenAPI Specifications?
How Does Kubernetes Build OpenAPI Specifications?
reallavalamp
 
Start with version control and experiments management in machine learning
Start with version control and experiments management in machine learningStart with version control and experiments management in machine learning
Start with version control and experiments management in machine learning
Mikhail Rozhkov
 
Java 어플리케이션 성능튜닝 Part1
Java 어플리케이션 성능튜닝 Part1Java 어플리케이션 성능튜닝 Part1
Java 어플리케이션 성능튜닝 Part1
상욱 송
 
How I hack on puppet modules
How I hack on puppet modulesHow I hack on puppet modules
How I hack on puppet modules
Kris Buytaert
 
chef loves windows
chef loves windowschef loves windows
chef loves windowsMat Schaffer
 

Similar to Groovy 1.8 et 2.0 au BreizhC@mp 2012 (9)

Using the Command Line: Bash and WP-CLI
Using the Command Line: Bash and WP-CLIUsing the Command Line: Bash and WP-CLI
Using the Command Line: Bash and WP-CLI
 
DevOps hackathon Session 2: Basics of Chef
DevOps hackathon Session 2: Basics of ChefDevOps hackathon Session 2: Basics of Chef
DevOps hackathon Session 2: Basics of Chef
 
Coffeescript intro
Coffeescript   introCoffeescript   intro
Coffeescript intro
 
PostgreSQL 12: What is coming up?, Enterprise Postgres Day
PostgreSQL 12: What is coming up?, Enterprise Postgres DayPostgreSQL 12: What is coming up?, Enterprise Postgres Day
PostgreSQL 12: What is coming up?, Enterprise Postgres Day
 
How Does Kubernetes Build OpenAPI Specifications?
How Does Kubernetes Build OpenAPI Specifications?How Does Kubernetes Build OpenAPI Specifications?
How Does Kubernetes Build OpenAPI Specifications?
 
Start with version control and experiments management in machine learning
Start with version control and experiments management in machine learningStart with version control and experiments management in machine learning
Start with version control and experiments management in machine learning
 
Java 어플리케이션 성능튜닝 Part1
Java 어플리케이션 성능튜닝 Part1Java 어플리케이션 성능튜닝 Part1
Java 어플리케이션 성능튜닝 Part1
 
How I hack on puppet modules
How I hack on puppet modulesHow I hack on puppet modules
How I hack on puppet modules
 
chef loves windows
chef loves windowschef loves windows
chef loves windows
 

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
 
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
 
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 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 2011Guillaume 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 LaforgeGuillaume 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 LaforgeGuillaume Laforge
 
Gaelyk - Paris GGUG 2011 - Guillaume Laforge
Gaelyk - Paris GGUG 2011 - Guillaume LaforgeGaelyk - Paris GGUG 2011 - Guillaume Laforge
Gaelyk - Paris GGUG 2011 - Guillaume Laforge
Guillaume Laforge
 
Gaelyk - Groovy Grails eXchange 2010 - Guillaume Laforge
Gaelyk - Groovy Grails eXchange 2010 - Guillaume LaforgeGaelyk - Groovy Grails eXchange 2010 - Guillaume Laforge
Gaelyk - Groovy Grails eXchange 2010 - Guillaume Laforge
Guillaume Laforge
 

More from Guillaume Laforge (19)

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
 
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
 
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
 
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
 
Gaelyk - Paris GGUG 2011 - Guillaume Laforge
Gaelyk - Paris GGUG 2011 - Guillaume LaforgeGaelyk - Paris GGUG 2011 - Guillaume Laforge
Gaelyk - Paris GGUG 2011 - Guillaume Laforge
 
Gaelyk - Groovy Grails eXchange 2010 - Guillaume Laforge
Gaelyk - Groovy Grails eXchange 2010 - Guillaume LaforgeGaelyk - Groovy Grails eXchange 2010 - Guillaume Laforge
Gaelyk - Groovy Grails eXchange 2010 - Guillaume Laforge
 

Recently uploaded

GraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge GraphGraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge Graph
Guy Korland
 
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
James Anderson
 
Elizabeth Buie - Older adults: Are we really designing for our future selves?
Elizabeth Buie - Older adults: Are we really designing for our future selves?Elizabeth Buie - Older adults: Are we really designing for our future selves?
Elizabeth Buie - Older adults: Are we really designing for our future selves?
Nexer Digital
 
Free Complete Python - A step towards Data Science
Free Complete Python - A step towards Data ScienceFree Complete Python - A step towards Data Science
Free Complete Python - A step towards Data Science
RinaMondal9
 
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdfFIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance
 
UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5
DianaGray10
 
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdfFIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance
 
Climate Impact of Software Testing at Nordic Testing Days
Climate Impact of Software Testing at Nordic Testing DaysClimate Impact of Software Testing at Nordic Testing Days
Climate Impact of Software Testing at Nordic Testing Days
Kari Kakkonen
 
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdfFIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance
 
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
Neo4j
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance
 
Uni Systems Copilot event_05062024_C.Vlachos.pdf
Uni Systems Copilot event_05062024_C.Vlachos.pdfUni Systems Copilot event_05062024_C.Vlachos.pdf
Uni Systems Copilot event_05062024_C.Vlachos.pdf
Uni Systems S.M.S.A.
 
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Albert Hoitingh
 
Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !
KatiaHIMEUR1
 
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
BookNet Canada
 
Epistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI supportEpistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI support
Alan Dix
 
20240605 QFM017 Machine Intelligence Reading List May 2024
20240605 QFM017 Machine Intelligence Reading List May 202420240605 QFM017 Machine Intelligence Reading List May 2024
20240605 QFM017 Machine Intelligence Reading List May 2024
Matthew Sinclair
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
Kari Kakkonen
 
Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...
Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...
Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...
SOFTTECHHUB
 
PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)
Ralf Eggert
 

Recently uploaded (20)

GraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge GraphGraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge Graph
 
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
 
Elizabeth Buie - Older adults: Are we really designing for our future selves?
Elizabeth Buie - Older adults: Are we really designing for our future selves?Elizabeth Buie - Older adults: Are we really designing for our future selves?
Elizabeth Buie - Older adults: Are we really designing for our future selves?
 
Free Complete Python - A step towards Data Science
Free Complete Python - A step towards Data ScienceFree Complete Python - A step towards Data Science
Free Complete Python - A step towards Data Science
 
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdfFIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
 
UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5
 
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdfFIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdf
 
Climate Impact of Software Testing at Nordic Testing Days
Climate Impact of Software Testing at Nordic Testing DaysClimate Impact of Software Testing at Nordic Testing Days
Climate Impact of Software Testing at Nordic Testing Days
 
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdfFIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
 
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
 
Uni Systems Copilot event_05062024_C.Vlachos.pdf
Uni Systems Copilot event_05062024_C.Vlachos.pdfUni Systems Copilot event_05062024_C.Vlachos.pdf
Uni Systems Copilot event_05062024_C.Vlachos.pdf
 
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
 
Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !
 
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
 
Epistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI supportEpistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI support
 
20240605 QFM017 Machine Intelligence Reading List May 2024
20240605 QFM017 Machine Intelligence Reading List May 202420240605 QFM017 Machine Intelligence Reading List May 2024
20240605 QFM017 Machine Intelligence Reading List May 2024
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
 
Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...
Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...
Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...
 
PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)
 

Groovy 1.8 et 2.0 au BreizhC@mp 2012

  • 1. Groovy 2.0 What’s up doc? Guillaume Laforge Cédric Champeau Groovy Project Manager Groovy Committer @glaforge @cedricchampeau 1
  • 2. Groovy 2.0 What’s up doc? Guillaume Laforge Cédric Champeau Groovy Project Manager Groovy Committer @glaforge @cedricchampeau 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? • Modularity • Alignments with JDK 7 • Project Coin (small language changes) • Invoke Dynamic support • Continued runtime performance improvements • Static type checking • Static compilation 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  pull  request    on  github   7
  • 9. Command chains Alternation of method names  pull  request    on  github   7
  • 10. Command chains Alternation of method names  pull  request    on  github   and parameters (even named ones) 7
  • 11. Command chains  pull  request    on  github   7
  • 12. Command chains Equivalent to:  pull  request    on  github            (              ).    (            ) 7
  • 13. Command chains commit  2    changes  on    master    branch 8
  • 14. Command chains            (  ).              (    ).              (            ) commit  2    changes  on    master    branch 8
  • 16. Command chains //  methods  with  multiple  arguments  (commas) 9
  • 17. Command chains //  methods  with  multiple  arguments  (commas) take  coffee    with  sugar,  milk    and  liquor 9
  • 18. Command chains //  methods  with  multiple  arguments  (commas) take  coffee    with  sugar,  milk    and  liquor //  leverage  named-­‐args  as  punctuation 9
  • 19. Command chains //  methods  with  multiple  arguments  (commas) take  coffee    with  sugar,  milk    and  liquor //  leverage  named-­‐args  as  punctuation check  that:  margarita    tastes  good 9
  • 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 //  closure  parameters  for  new  control  structures 9
  • 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 given  {}    when  {}    then  {} 9
  • 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  {} //  zero-­‐arg  methods  require  parens 9
  • 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 select  all    unique()  from  names 9
  • 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 //  possible  with  an  odd  number  of  terms 9
  • 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 take  3    cookies 9
  • 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 9
  • 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 9
  • 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 9
  • 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 9
  • 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        (  ). 9
  • 31. 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! 10
  • 32. 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 11
  • 33. 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) 12
  • 34. Closure annotation parameters @Retention(RetentionPolicy.RUNTIME) @interface  Invariant  {                Class  value()  //  a  closure  class }   { @Invariant({  number  >=  0  }) class  Distance  {                float  number         Poor- man’s GCon 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) 12
  • 36. Closure memoization def  plus  =  {  a,  b  -­‐>  sleep  1000;  a  +  b  }.memoize() 13
  • 37. Closure memoization def  plus  =  {  a,  b  -­‐>  sleep  1000;  a  +  b  }.memoize() assert  plus(1,  2)  ==  3  //  after  1000ms 13
  • 38. 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 13
  • 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 assert  plus(2,  2)  ==  4  //  after  1000ms 13
  • 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 assert  plus(2,  2)  ==  4  //  return  immediately     13
  • 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       13
  • 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       //  at  least  10  invocations  cached 13
  • 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 def  plusAtLeast  =  {  ...  }.memoizeAtLeast(10) 13
  • 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)   13
  • 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)   //  at  most  10  invocations  cached 13
  • 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 def  plusAtMost  =  {  ...  }.memoizeAtMost(10)   13
  • 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)   //  between  10  and  20  invocations  cached 13
  • 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 def  plusAtLeast  =  {  ...  }.memoizeBetween(10,  20) 13
  • 49. Builtin JSON support • Consuming • Producing • Pretty-printing 14
  • 50. 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  } 15
  • 51. Builtin JSON support import  groovy.json.*     def  json  =  new  JsonBuilder()     json.person  {                name  "Guillaume"        age  34                pets  "Hector",  "Felix" }   println  json.toString() 16
  • 52. Builtin JSON support import  groovy.json.*     def  json  =  new  JsonBuilder()     json.person  {         {                name  "Guillaume"        "person":  {                                "name":  "Guillaume",            age  34                        "age":  34,                        pets  "Hector",  "Felix"                "pets":  [                         }                          "Hector",                   println  json.toString()                        "Felix"                                ]                } } 16
  • 53. 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"                                ]                } } 17
  • 54. New AST transformations • @Log • Controlling execution • @ThreadInterrupt • @Field • @TimedInterrupt • @ConditionalInterrupt • @AutoClone • @InheritConstructor • @AutoExternalizable • @WithReadLock • @Canonical • @WithWriteLock • @ToString • @EqualsAndHashCode • @TupleConstructor • @ListenerList 18
  • 55. @Log • Four different loggers can be injected •@Log •@Commons import  groovy.util.logging.*   •@Log4j   @Log •@Slf4j class  Car  {                Car()  {                                log.info  'Car  constructed'     • Possible to implement        } }   your own strategy   def  c  =  new  Car() 19
  • 56. @Log • Four different loggers can be injected •@Log •@Commons import  groovy.util.logging.*   •@Log4j   @Log •@Slf4j Guarded w/ an if class  Car  {                Car()  {                                log.info  'Car  constructed'     • Possible to implement        } }   your own strategy   def  c  =  new  Car() 19
  • 57. 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 20
  • 58. @ThreadInterrupt @ThreadInterrupt import  groovy.transform.ThreadInterrupt     while  (true)  {        //  eat  lots  of  CPU } 21 33
  • 59. @ThreadInterrupt @ThreadInterrupt import  groovy.transform.ThreadInterrupt     while  (true)  { {        if  (Thread.currentThread().isInterrupted())                throw  new  InterruptedException() }        //  eat  lots  of  CPU } 21 33
  • 60. @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) 22
  • 61. @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() 23
  • 62. @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 24
  • 63. @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)            } } 25
  • 64. @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)            } } 25
  • 65. Miscellaneous • 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 26
  • 66. Compilation customizers • Ability to apply some customization to the Groovy compilation process • Three available customizers •ImportCustomizer •ASTTransformationCustomizer •SecureASTCustomizer • But you can implement your own 27
  • 67. 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  ")                             28
  • 70. Groovy 2.0 • A more modular Groovy • Java 7 alignements: Project Coin • binary literals • underscore in literals • multicatch • JDK 7: InvokeDynamic • Static type checking • Static compilation 31
  • 71. Groovy Modularity • Groovy’s «all» JAR weighs in at 6 MB • 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
  • 72. The new JARs • A smaller groovy.jar: 3MB • Modules •console • sql •docgenerator • swing •groovydoc • servlet •groovysh • templates •ant • test •bsf • testng •jsr-223 • json •jmx • xml 33
  • 73. Extension modules • Create your own module •contribute instance extension methods package  foo class  StringExtension  {        static  introduce(String  self,  String  name)  {                "Hi  ${name),  I’m  ${self}"        } } //  usage:  "Guillaume".introduce("Cédric") 34
  • 74. Extension modules • Create your own module •contribute instance extension methods Same structure as Categories package  foo class  StringExtension  {        static  introduce(String  self,  String  name)  {                "Hi  ${name),  I’m  ${self}"        } } //  usage:  "Guillaume".introduce("Cédric") 34
  • 75. Extension modules • Create your own module •contribute class extension methods package  foo class  StaticStringExtension  {        static  hi(String  self)  {                "Hi!"        } } //  usage:  String.hi() 35
  • 76. Extension module descriptor • Descriptor in: META-INF/services/ org.codehaus.groovy.runtime.ExtensionModule moduleName  =  stringExtensions moduleVersion  =  1.0 //  comma-­‐separated  list  of  classes extensionClasses  =  foo.StringExtension //  comma-­‐separated  list  of  classes staticExtensionClasses  =  foo.StaticStringExtension 36
  • 77. Java 7 / JDK 7 • Project Coin and InvokeDynamic 37
  • 78. 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 38
  • 79. 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 39
  • 80. Multicatch • One block for multiple exception caught •rather than duplicating the block try  {        /*  ...  */ }  catch(IOException  |  NullPointerException  e)  {        /*  one  block  to  treat  2  exceptions  */ } 40
  • 81. 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 41
  • 83. 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... 43
  • 84. Typos in a vars or methods import  groovy.transform.TypeChecked   void  method()  {}   @TypeChecked  test()  {        //  Cannot  find  matching  method  metthhoood()        metthhoood()          def  name  =  "Guillaume"        //  variable  naamme  is  undeclared        println  naamme } 44
  • 85. Typos in a vars or methods 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 } 44
  • 86. Typos in a vars or methods 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 } 44
  • 87. 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' 45
  • 88. 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' 45
  • 89. 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 } 46
  • 90. 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 } 46
  • 91. 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        } } 47
  • 92. Statically checked & dyn meth @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() } 48
  • 93. Instanceof checks @TypeChecked   void  test(Object  val)  {        if  (val  instanceof  String)  {                println  val.toUpperCase()        }  else  if  (val  instanceof  Number)  {                println  "X"  *  val.intValue()        } } 49
  • 94. 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()        } } 49
  • 95. 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 49
  • 96. 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] } 50
  • 97. 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 & Comparable> 50
  • 98. 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 & Comparable> 50
  • 99. 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! } 51
  • 100. 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 52
  • 101. Runtime metaprogramming @TypeChecked   void  test()  {        Integer.metaClass.foo  =  {}        123.foo() } 53
  • 102. Runtime metaprogramming @TypeChecked   void  test()  {        Integer.metaClass.foo  =  {}        123.foo() } Not allowed: metaClass property is dynamic 53
  • 103. Runtime metaprogramming @TypeChecked   void  test()  {        Integer.metaClass.foo  =  {}        123.foo() } Method not Not allowed: recognized metaClass property is dynamic 53
  • 104. Explicit type for closures @TypeChecked  test()  {        ["a",  "b",  "c"].collect  {                it.toUpperCase()  //  Not  OK        } } • A « Groovy Enhancement Proposal » to address the issue 54
  • 105. Explicit type for closures @TypeChecked  test()  {        ["a",  "b",  "c"].collect  {  String  it  -­‐>                it.toUpperCase()  //  OK,  it’s  a  String        } } • A « Groovy Enhancement Proposal » to address the issue 54
  • 106. Closure shared variables @TypeChecked  test()  {        def  var  =  "abc"                      def  cl  =  {  var  =  new  Date()  }        cl()        var.toUpperCase()    //  Not  OK! } 55
  • 107. 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! } 55
  • 108. Closure shared variables var assigned in the closure: «shared closure variable» @TypeChecked  test()  { Impossible to        def  var  =  "abc"               ensure the        def  cl  =  {  var  =  new  Date()  } assignment        cl() really happens        var.toUpperCase()    //  Not  OK! } 55
  • 109. Closure shared variables var assigned in the closure: «shared closure variable» @TypeChecked  test()  { Impossible to        def  var  =  "abc"               ensure the        def  cl  =  {  var  =  new  Date()  } assignment        cl() really happens        var.toUpperCase()    //  Not  OK! } Only methods of the most specific compatible type (LUB) are allowed by the type checker 55
  • 110. 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! } 56
  • 111. 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 56
  • 112. 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 57
  • 113. 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 58
  • 114. Disadvantages • But you loose: • Dynamic features •metaclass changes, categories, etc. • Dynamic method dispatch •although as close as possible to «dynamic» Groovy 59
  • 115. Statically compiled & dyn meth @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() } 60
  • 116. 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) 61
  • 117. What about performance? Pi (π) Binary Fibonacci quadrature trees Java 188 ms 97 ms 3.6 s Static 1.7 1.8 2.0 compilation 202 ms 101 ms 4.4 s Primitive optimizations 360 ms 111 ms 23.7 s No prim. optimizations 2590 ms 3220 ms 50.0 s 62
  • 118. 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 63
  • 119. 64
  • 120. Thank you! e eL aforg pment Gu illaum ovy Develo ro He ad of G om gmail.c au e@ glaforg rge Ch ampe itter Email: @glafo rge édric ore Comm : .t o/glafo m C Twitter : http://gplus spot.co Groov yC gmail.c om + pp Google p://glaforge.a au@ hampe peau tt ric.c Blog: h ail: ced edriccham eau Em :@ c to/cchamp Twitter : http://gplus. melix + / Google p://jroller.com tt Blog: h 65
  • 121. Questions & Answers • Got questions, really? Q&A 66
  • 122. Image credits • Bugs bunny: http://storage.canalblog.com/63/56/517188/47634843.jpeg • 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 • Slurp: http://www.ohpacha.com/218-532-thickbox/gamelle-slurp.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 • 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 • Around the corner: http://3.bp.blogspot.com/-wvfO5NUbi8Q/TzBqTh4SOsI/AAAAAAAADOg/lRE9XVHGiOc/s1600/around-the-corner_large.jpg • Lube: http://images.motorcycle-superstore.com/ProductImages/OG/0000_Motul_Chain_Lube_Road_--.jpg 67
  • 123. Groovy 1.8 AST Transform @Grab 1 // methods with multiple arguments (commas) 2 take coffee  with sugar, milk  and liquor 3 4 // leverage named-args as punctuation 5 check that: margarita  tastes good 6 7 // closure parameters for new control structures 8 given {}  when {}  then {} 9 10 // zero-arg methods require parens 11 select all  unique() from names 12 13 // possible with an odd number of terms 14 take 3  cookies
  • 124. Groovy 1.8 AST Transform @Grab 1 // methods with multiple arguments (commas) 2 take coffee  with sugar, milk  and liquor 3 4 // leverage named-args as punctuation 5 check that: margarita  tastes good Need parens 6 7 // closure parameters for new control there! structures 8 given {}  when {}  then {} 9 10 // zero-arg methods require parens 11 select all  unique() from names 12 13 // possible with an odd number of terms 14 take 3  cookies